链接: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 {
/**
步骤:
1. 创建对象全类名和执行方法定义在配置文件
2. 在程序中加载配置文件
3. 使用反射进入内存
4. 创建对象
5. 执行方法
*/
//加载配置文件
//创建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();
//public T newInstance()
//创建由此类对象表示的类的新实例。
// 该类被实例化为一个具有空参数列表的new表达式。 如果类尚未初始化,则初始化该类。
Method method = aClass.getDeclaredMethod(methodName);
//getDeclaredMethod(String name, 类<?>... parameterTypes)
//返回一个 方法对象,它反映此表示的类或接口的指定声明的方法 类对象。
method.setAccessible(true);//暴力反射
method.invoke(o);
//invoke(Object obj, Object... args)
//在具有指定参数的 方法对象上调用此 方法对象表示的底层方法。
System.out.println(aClass);
System.out.println(o);
//class com.yuhang.domain.Person
//Person{name='null', age='null', a='null', b='null', c='null', d='null', e='null'}
}
}
[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
纠错-----2021年10月2日13:58:08
Object o = aClass.newInstance();//使用此 Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。 // System.out.println(o);//Person{name='null', age='null', a='null', b='null', c='null', d='null', e='null'错误!
Object o = aClass.newInstance(); //public T newInstance() //创建由此类对象表示的类的新实例。 // 该类被实例化为一个具有空参数列表的new表达式。 如果类尚未初始化,则初始化该类。