首页 > 编程语言 > 详细

【Java反射机制 01】

时间:2020-09-09 17:59:04      阅读:83      评论:0      收藏:0      [点我收藏+]

一、含义:

Java反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性
这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制

动态获取类中信息,就是Java反射
可以理解为对类的解剖

 技术分享图片

 

 反射必须要有接口和配置文件两大元素。

二、 字节码文件对象

想要对一个类文件进行解剖,只要获取到该类字节码文件对象即可

|-- 用于描述字节码的类叫class Class{

  提供获取字节码文件中的内容。比如名称,字段,构造函数,一般函数

}

该类就可以获取字节码文件中的所有内容,那么反射,就是依靠该类完成的。

技术分享图片

 

 三、获取Class对象的三种方式

package com.FansheReflect;

import com.JavaFanShe.Person;

/**
 * @Author wufq
 * @Date 2020/9/8 16:38
 */
public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException {
//        getClassobject_1();
//        getClassobject_2();
        getClassobject_3();

    }

    /*
    方式三:通过给定类的字符串名称就可以获取类,更为扩展
    可是用Class类中的方法完成。
    该方法就是forName
    这种方法只需要名称即可,更方便,扩展性更强
    * */

    public static void getClassobject_3() throws ClassNotFoundException {
        String className = "com.JavaFanShe.Person";//
        Class classs = Class.forName(className);  //以下片段返回命名为java.lang.Thread的类的运行时Class描述符,所以定义的类字符串是完整的带包名的类名称
        System.out.println(classs);
    }

    /*
    * 方式一:获取字节码对象的方式:
    * 1.object类中的getClass方法
    * 想要这种方式,必须要明确具体的类,并创建对象
    * 麻烦!!!
    * */

    public static void getClassobject_1(){
        Person p = new Person();
        Class aClass=p.getClass(); //调用person的缺省构造器    -->Person run...

        Person p1 = new Person();
        Class p1Class= p1.getClass();//调用person的缺省构造器  -->Person run...

        System.out.println(aClass==p1Class);
    }

    /*方式二:
    * 任何数据类型都具备一个静态的属性.class来获取其对应的class对象
    * 相对简单,但是还是要明确用到类中的静态成员
    * */
    private static void getClassobject_2() {

        Class classz = Person.class;
        Class classz1 = Person.class;
        System.out.println(classz==classz1);
    }
}

四、获取Class中的构造函数

|-- 寻找类名称文件,并加载进内存,生成class对象

|-- 通过getConstructor(Class<?>... parameterTypes)方法获取指定的构造方法,返回Constructor对象

|-- 通过newInstance()方法实现对象的生成

备注:如果调用缺省构造器的话,就不需要获取指定的构造方法,,直接实现方法的生成

 

package com.FansheReflect;


import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @Author wufq
 * @Date 2020/9/9 15:46
 */
public class ReflectDemo01 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {

        //creatNewObject_2();
        //creatNewObject();
        creatNewObject_1();

    }

    public static void creatNewObject(){

        //早期初始化对象-->缺省构造器、构造方法调用
        com.JavaFanShe.Person p = new com.JavaFanShe.Person();

        com.JavaFanShe.Person p1 = new com.JavaFanShe.Person("小强",23);

    }

    //现在:通过该名称类文件地址  -->缺省构造器、构造方法调用
    public static void creatNewObject_1() throws ClassNotFoundException, IllegalAccessException, InstantiationException {

        String Naame ="com.JavaFanShe.Person";
        //寻找该名称类文件,并加载进内存,并产生class对象
        Class classs = Class.forName(Naame);
        //如何产生对象呢?
        Object obj =classs.newInstance();

    }

    public static void creatNewObject_2() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

        String Naame ="com.JavaFanShe.Person";
        //寻找该名称类文件,并加载进内存,并产生class对象
        Class classs = Class.forName(Naame);
        //获取到了指定对象的构造方法
        Constructor con =classs.getConstructor(String.class,int.class);
        //真实产生对象
        Object obj = con.newInstance("小强",22);

    }

}

=====执行结果=====
Person param run...小强::22
Person run...
Person param run...小强::23
Person run...

 

【Java反射机制 01】

原文:https://www.cnblogs.com/frankruby/p/13639934.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!