
链接:Class对象功能
链接:Class对象功能代码实现
反射案例
写一个框架,不改变代码,可以创建任意类的对象,且执行任意方法(只能调用无参方法,解决方法不知。)
实现:配置文件,反射
步骤:
创建对象全类名和执行方法定义在配置文件
在程序中加载配置文件
使用反射进入内存
创建对象
执行方法
因为 Object o = aClass.newInstance();//使用此 Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。
newInstance()为空。
[pro.properties]
className=com.yuhang.domain.Person methodName=eat
[ReflectTest]
package com.yuhang.reflect;
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对象
Properties properties = new Properties();
//加载配置文件
//获取文件路径
ClassLoader classLoader = ReflectTest.class.getClassLoader();//ReflectTest.class字节码 getClassLoader()文件类加载器 加载进内存
InputStream resourceAsStream = classLoader.getResourceAsStream("pro.properties");//找配置文件 getResourceAsStream()获取字节流
properties.load(resourceAsStream);
//获取配置文件中定义的数据
String className = properties.getProperty("className");
String methodName = properties.getProperty("methodName");
// System.out.println(className+" "+methodName);//com.yuhang.domain.Person look
//加载类进内存
Class aClass = Class.forName(className);
//创建对象
Object o = aClass.newInstance();//使用此 Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。
// System.out.println(o);//Person{name='null', age='null', a='null', b='null', c='null', d='null', e='null'}
//获取对象方法对象
Method method = aClass.getDeclaredMethod(methodName);
//getDeclaredMethod(String name, 类>... parameterTypes)
//返回一个 方法对象,它反映此表示的类或接口的指定声明的方法 类对象。
method.setAccessible(true);//暴力反射
method.invoke(o);
//invoke(Object obj, Object... args)
//在具有指定参数的 方法对象上调用此 方法对象表示的底层方法。
}
}
[Person]
package com.yuhang.domain;
public class Person {
private String name;
private String age;
public String a;
protected String b;
String c;
private String d;
private String e;
public Person() {
}
public Person(String name, String age) {
this.name = name;
this.age = age;
}
private Person(String e){
this.e = e;
System.out.println("私有"+e);
}
public String getName() {
return name;
}
private void getName1(){}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + ''' +
", age='" + age + ''' +
", a='" + a + ''' +
", b='" + b + ''' +
", c='" + c + ''' +
", d='" + d + ''' +
", e='" + e + ''' +
'}';
}
public void look(){
System.out.println("看");
}
public void look(int a){
System.out.println("看"+a);
}
private void eat(){
System.out.println("chi");
}
public void lll(int a){
System.out.println(a);
}
}
2021年9月29日11:22:50