2021-06-02

Java反射机制

1.定义:在JVM运行过程中,获取、设置、调用类的成员变量,成员方法的一种动态机制。
2.使用方法

2.1获取Class类
Clasd.forName(String str)
Object.class
Object.getClass(String str)
PS:三中方法获取的Class类是完全一致的。
因为当JVM加载类的时候会生成一个java.lang.class类,一个类只会产生一个字节码文件,所以这三个方法获取的class对象完全一致。

2.2获取构造方法
getConstructor(String str)
获取:public修饰的指定的构造方法
返回值:Constructor
getConstructors()
获取:所有public修饰的构造方法
返回值:Constructor[ ]
getDeclaredConstructor(string str)
获取:获得有參构造器
返回值:Constructor 对象 getDeclaredConstructors()
获取:所有构造器
返回值:Constructor[ ]数组对象

2.3获取成员变量
U)CXK3W2.png)(举个例子)
Class aclass= DemoClass.class;
aclass.getField(String str)
aclass.getFields()
aclass.getDeclared(String str)
aclass.getDeclareds( )
PS:具体区别参考获得构造方法。
2.4获取成员方法

 public Method getMethod(String name,Class<?>... parameterTypes) 		//name获得的方法的方法名
    //Class<?>... parameterTypes 获得方法的参数类型的类类型
Method method = aClass.getMethod("test",String.class);// public void test(String s)

getMethods( )
getDeclaredMethod(String str)
getDeclaredMethods( )
PS:.具体用法可以参考获取构造器的方法
区别可以获取public,static,private,
修饰的成员变量或者成员方法
注意获取到的是变量还是数组变量.

3.初始化对象
可以根据获取的无参构造方法,初始化一个类。

Class c=DemoClass.class;

//public DemoClass()无参构造方法
Construct cons=c.getConstructor( );

Object o=c.getInstance( );
通过字节码文件获得Class反射对象,使用Class对象得到public的公共无参构造方法对象类Construct,通过Construct类的
T newInstance(Object … initparameter )方法获得DemoClass对象

3.2 通过有參构造方法创建对象
Class c=DemoClass.class;

//public DemoClass(String name,int id,
float salary);有參构造方法
Construct cons=c.getConstructor( String.class,
Int.class,Float.class);

Object o=c.getInstance(
“程婷”,20,11000f);

可以得到一个被有參构造方法初始化的DemoClass对象.

  1. Field类中的set(Object key,Object value) 设置成员变量值;

    setAccessible(boolean flag);//设为暴力访问(访问私有或者是默认访问修饰符成员变量)

    //1、根据无参构造方法,创建对象o
    Class<?> bClass = Class.forName("com.xc.pojo.Student");
    Constructor<?> constructor1 = bClass.getDeclaredConstructor();
    Object obj = constructor1.newInstance();
    
    Field[] declaredFields1 = bClass.getDeclaredFields();
    declaredFields1[0].setAccessible(true);//设为暴力访问(访问私有或者是默认访问修饰符成员变量)
    declaredFields1[1].setAccessible(true);
    
    declaredFields1[0].set(o,"小芳");
    declaredFields1[1].set(o,20);
    declaredFields1[2].set(o,"湖南省长沙市");
    for (Field f : declaredFields1) {
        System.err.println(f);
    }
    

5、Method中用于执行对象方法的方法public Object invoke(Object arg0,Object… agrs);

Class<?> aClass = Class.forName("com.xc.pojo.Student");
Constructor<?> constructor = aClass.getDeclaredConstructor(String.class, int.class, String.class);
Object o = constructor.newInstance("小程", 20, "五一广场五一新干线");
Method[] methods = aClass.getDeclaredMethods();
for (Method method : methods) {
    method.setAccessible(true);
    System.err.println(method.invoke(o));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值