Fork me on GitHub

Java反射机制

c#, Python都是动态语言,可以在运行时改变自身结构。而反射是Java非常重要的动态特性

思考:方法变量化是不是也是一种动态性的体现?

理解Class类并获取Class类的实例

Class的实例就对应一个运行时类

1
2
3
4
5
6
7
//方式一:调用运行时类的属性:.classs
Class clazz1 = Person.class;
//方式二:通过运行时类的对象调用getClass()
Person p1 = new Person();
Class clazz2 = p1.getClass();
//方式三:调用Class的静态方法:forName(String classPath),实际中应用多,体现了反射的动态性
Class clazz3 = Class.forname("java.lang.String");

补充一点,后续学到编译内容是再更新。

类的加载过程

Load=>Link=>Initialize

Load:将class文件读入内存,并在堆里为之创建一个java.lang.Class对象。此过程由类加载器完成。

Link:将类的二进制数据合并到JRE中

Initialize: JVM负责对类进行初始化

创建运行时类的对象

反射机制应用最多的地方来了!

创建类的对象:调用Class对象的newInstance()方法

要求类必须有一个无参构造器,类的构造器访问权限要足够。

1
2
Class clazz = Person.class;
Person obj = clazz.newInstance();

没有无参的构造器也可以创建对象,调用类中的指定构造器

1
2
3
4
5
6
Class clazz = Class.forName("aa.Java.Person");
//获取指定构造器
Constructor con = clazz.getDeclaredConstructor(String.class,Integer.class);
con.setAccessible(true);
//调用此构造器创建运行时类的对象
Person p2 = (Person)con.newInstance("Peter",20);

调用运行时类的指定结构

调用指定属性

1
2
3
4
5
6
7
8
9
Class clazz = Person.class;
//创建运行时类的对象
Person p = (Person)clazz.newInstance();
//获取运行时类中指定变量名的属性
Field name = clazz.getDeclaredField("name");
//保证当前属性是可访问的
name.setAccessible(ture);
//设置指定对象的此属性值
name.set(p,"name");

调用指定方法同理

实例化class==>找到方法==>调用方法invoke()

使用频率更高。

1
2
3
4
Class clazz = Person.class;
Method show = clazz.getDeclaredMethod("show", String.class);
show.setAccessible(true);
Object returnValue = show.invoke(p, "CHN");

调用指定构造器

已经在创建运行时类的对象部分介绍过。

反射的应用–动态代理

补充:静态代理,以设计模式中的工厂模式做例,实际上是多态性的体现。

碎碎念,到处都存在的多态性和解耦合操作。

分别有三个对象,提供一个接口,代理类和被代理类。代理类通过聚合的方式调用接口,被代理类实现接口中的目标方法。从而利用多态特点,代理类调用被代理类实现的目标方法。听起来比较绕口,就举个例子。

1
2
3
4
5
6
7
8
9
10
class ProxyClothFactory implements ClothFactory{
private ClothFactory factory;
public ProxyClothFactory(ClothFactory factory){
this.factory = factory;
}
@override
public void produceCloth(){
factory.produceCloth();
}
}

动态代理内容有待补充。后续更新。



本文标题:Java反射机制

文章作者:tsuki

发布时间:2021.06.01 - 21:35

最后更新:2021.06.01 - 21:35

原始链接:https://tsuki419.github.io/JAVA反射机制.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------THE END-------------
0%