一、反射机制概述
二、Class类
三、反射获取一个类的父类和接口
四、反射获取一个类的构造方法
五、通过反射创建一个对象
六、反射机制获取类的方法
七、反射机制获取类的属性和包
八、反射机制调用指定方法
九、反射机制调用指定属性
十、java动态代理
一、反射机制概述
二、Class类
代码部分如下:
首先创建类Person,然后创建类Test
(通过Class的静态方法forName(“类的路径”))是常用方法
三、反射获取一个类的父类和接口
关键字:getSuperclass()、getInterfaces()
代码部分如下:
(1)创建类Person,接口Move,接口Study;
(2)创建类Student继承类Person,实现两个接口;
(3)创建类Test3,在main方法中试验
执行结果为:
父类:day14.Person
接口:day14.Move
接口:day14.Study
四、反射获取一个类的构造方法
关键词:getConstructors()、getDeclaredConstructors()、getModifiers()、getName()、getParameterTypes()
代码部分如下:
(1)在类Student中建立构造方法
(2)在main方法中试验
①获取类的公有的构造方法
执行结果为:
构造方法名称:day14.Student
构造方法的修饰符:1
构造方法的参数类型:java.lang.String
构造方法名称:day14.Student
构造方法的修饰符:1
②获取类的所有(公有+私有)的构造方法
执行结果为:
构造方法名称:day14.Student
构造方法的修饰符:2
构造方法的参数类型:java.lang.String
构造方法的参数类型:int
构造方法名称:day14.Student
构造方法的修饰符:1
构造方法的参数类型:java.lang.String
构造方法名称:day14.Student
构造方法的修饰符:1
五、通过反射创建一个对象
有以下三个构造方法:
①公有无参
②公有有参
③私有有参
用三种方法在main方法中分别创建三个对象,代码部分如下:
关键词 newInstance()、getConstructor(String.class)、getDeclaredConstructor(String.class, int.class)
执行结果为:
第一中学
jack
21
六、反射机制获取类的方法
关键词 getMethods()、getDeclaredMethods()
代码部分如下:
执行结果为(与类Student中方法信息吻合):
方法名:test
返回值类型:void
修饰符:2
参数类型java.lang.String
方法名:getschool
返回值类型:class java.lang.String
修饰符:1
方法名:studyInfo
返回值类型:void
修饰符:1
方法名:moveType
返回值类型:void
修饰符:1
方法名:showInfo
返回值类型:void
修饰符:1
注意:使用getMethods()时,返回更多方法,猜测是把继承的父类Object的方法也打印出来了。
七、反射机制获取类的属性和包
代码部分如下:
关键字 getFields()、getDeclaredFields()、getPackage()
执行结果为:
属性的名称:school
属性的类型:class java.lang.String
修饰符:1
属性的名称:privateField
属性的类型:class java.lang.String
修饰符:2
day14
注意:似乎在本节所有提及的形如 getFields()、getDeclaredFields()的,用 Declared 加以区分的关键字,都有共同处:
一个包含父类的,公有的;
加了Declared,只在本类中所有的(公有的+私有的)。
八、反射机制调用指定方法
关键字 getMethod、invoke
程序部分如下:
(1)
(2)
(3)获取公有方法
(4)获取私有方法(实际证明还是公有+私有方法)
(5)获取重载方法(同名而不同性质)
(6)获取一个有返回值的方法
(7)执行结果为:
这是setInfo(String name, String school)方法
这是私有方法test(String name)
这是setInfo(int age)方法
第一中学
九、反射机制调用指定属性
代码部分如下:
关键字 Field、getField、getDeclaredField、set、get、setAccessible
(1)
(2)反射创建一个对象(区别于八中的方法,达到的最终效果是一样的)
(3)获取公有属性并更改
(4)获取私有属性并更改
(5)执行结果为:
第二中学
测试私有属性
十、java动态代理
关键字:InvocationHandler、Proxy.newProxyInstance
需求:
在各个方法执行前输出:(方法名)开始执行;
在各个方法执行完成后输出:(方法名)执行完毕。
代码部分如下:
(1)先创建存储各个方法名的接口
(2)创建类TestDemoImpl连接接口
(3)创建动态代理类,连接接口InvocationHandler
(4)在main方法中使用
①首先调用为更改的方法,观察执行结果
②传入要代理的对象(使用了动态代理类中编写的有参构造)
③调用Proxy.newProxyInstance(loader, interfaces, h)
(5)执行结果为:
执行test1()方法
执行test2()方法
&===============&
test1方法开始执行
执行test1()方法
test1方法执行完毕
&-------------&
test2方法开始执行
执行test2()方法
test2方法执行完毕