JAVA—反射–框架的灵魂
什么是反射?
将类的各个组成部分,封装为其他的对象;如下图
通过反射获取成员变量:
getFields():获取所有Public修饰的成员变量
Class< Person> personClass = Person. class ;
Field[ ] fields = personClass. getFields ( ) ;
for ( Field field : fields) {
System. out. println ( field) ;
}
getField(String name):获取指定名字的public修饰的成员变量,以及成员变量的值的修改
Field name = personClass. getField ( "a" ) ;
System. out. println ( name) ;
Person p = new Person ( ) ;
Object value = name. get ( p) ;
System. out. println ( value) ;
name. set ( p, "你好" ) ;
System. out. println ( p) ;
getDeclaredFields():获取所有的成员变量
Field[ ] declaredFields = personClass. getDeclaredFields ( ) ;
for ( Field declaredField : declaredFields) {
System. out. println ( declaredField) ;
}
getDeclaredField(String name):获取指定的成员变量,以及设置属性的值
Field age = personClass. getDeclaredField ( "age" ) ;
System. out. println ( age) ;
age. setAccessible ( true ) ;
Object ageValue = age. get ( p) ;
System. out. println ( ageValue) ;
age. set ( p, 12 ) ;
System. out. println ( age. get ( p) ) ;
获取构造方法:
Class personClass = Person. class ;
Constructor constructor = personClass. getConstructor ( ) ;
System. out. println ( constructor) ;
Constructor constructor1 = personClass. getConstructor ( String. class , int . class ) ;
System. out. println ( constructor1) ;
用构造器创建对象
Object person = constructor. newInstance ( "张三" , 12 ) ;
personClass. newInstance ( ) ;
获取成员方法:
获取所有public修饰的方法
Class personClass = Person. class ;
Method[ ] methods = personClass. getMethods ( ) ;
for ( Method method : methods) {
System. out. println ( method) ;
}
获取指定的方法并且执行方法
Method eat = personClass. getMethod ( "eat" , String. class ) ;
System. out. println ( eat) ;
Person person = new Person ( ) ;
eat. invoke ( person, "aa" ) ;
获取方法名:
Method[ ] methods = personClass. getMethods ( ) ;
for ( Method method : methods) {
System. out. println ( method) ;
System. out. println ( method. getName ( ) ) ;
}
获取类名
Class personClass = Person. class ;
System. out. println ( personClass. getName ( ) ) ;
获取Class对象的三种方式(对象上图的三个阶段)
Class. forName ( "全类名" ) ;
类名. class
对象. getClass
例:需求:写一个“框架类”,可以创建任意类的对象,可以执行任意方法
配置文件
className = Test. Person
methodName = eat
Person类:
public class Person {
private String name;
private int age;
public Person ( ) {
}
public Person ( String name, int age) {
this . name = name;
this . age = age;
}
public void eat ( ) {
System. out. println ( "吃饭" ) ;
}
}
main:
package Test;
import java. io. InputStream;
import java. lang. reflect. Method;
import java. util. Properties;
public class ReflectTest {
public static void main ( String[ ] args) throws Exception {
Properties prop = new Properties ( ) ;
ClassLoader classLoader = ReflectTest. class . getClassLoader ( ) ;
InputStream is = classLoader. getResourceAsStream ( "pro.properties" ) ;
prop. load ( is) ;
String className = prop. getProperty ( "className" ) ;
String methodName = prop. getProperty ( "methodName" ) ;
Class cls = Class. forName ( className) ;
Object obj = cls. newInstance ( ) ;
Method method = cls. getMethod ( methodName) ;
method. invoke ( obj) ;
}
}