反射:将类的各个组成部分封装为其他对象。
三阶段:源代码阶段、class类对象阶段、运行时阶段
好处:在程序运行中操作类对象
可以解耦,提高扩展性
获取Class对象的方法:
1.Class.forName("全类名"),将字节码文件加载进内存,返回Class对象
多用于配置文件,将类名定义在配置文件中。读取文件,加载类
2.类名.class:通过类名的属性class获取字节码文件方式
多用于参数传递
3.对象.getclass
多用于对象获取
同一个.class 文件在一次程序运行中只被加载一次。
class对象功能
获取功能:
1.获取成员变量们
*Field[] getFields():获取所有public成员变量
field a=personclass.getfield(nam:"a")
person p =new person();
object value = a.get(p);
a.set(p,"张三")
*Field[] getFields(String name)
*Field[] getDeclaredFields()
不考虑修饰符
b.setAccessible(true)//暴力反射
*Field[] gettDeclaredFields(String name)
2. 获取构造方法们
constructor[] getconstructors()
3.获取成员方法们
method[] getmethods
4.获取类名
package reflect;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class treflectest {
public static void main(String[] args) throws Exception{
//可以创建对象,执行方法
//1.加载配置文件
//1.1创建properties
Properties pro =new Properties();
//1.2加载配置文件 获取路劲
ClassLoader classLoader =treflectest.class.getClassLoader();
InputStream is=ClassLoader.getSystemResourceAsStream("pro.properties");
pro.load(is);
//2.获取文件中的数据
String className = pro.getProperty("className");
String methodName = pro.getProperty("methodName");
//3.加载类进内存
Class cls=Class.forName(className);
//4.创建对象
Object obj= cls.newInstance();
//5.获取对象
Method method =cls.getMethod(methodName );
//6.执行
method.invoke(obj);
}
}