目录
反射的引入
public class Cat {
private String name="招财猫";
public Integer age=10;
public Cat() {
}
public Cat(String name) {
this.name = name;
}
public void hi(){
//System.out.println("hi"+name);
}
}
//1、传统的方式--new
/*Cat cat = new Cat();
cat.hi();*/
//2、反射的引入
Properties properties = new Properties();
properties.load(new FileInputStream("src\\re.properties"));
//得到全路径
String classfullpath = properties.get("classfullpath").toString();
String methodName = properties.get("method").toString();
System.out.println(classfullpath);
System.out.println(methodName);
//创建对象
//通过外部文件的配置 在不修改源码的情况下 来控制程序,也符合设计模式的ocp原则
//ocp:开闭原则:不修改源码,扩展功能
//3、快速入门
//(1)加载类,返回Class类型的对象
Class clazz = Class.forName(classfullpath);
//(2)通过clazz 得到全路径对应类的一个实例
System.out.println(clazz.newInstance().getClass());//得到运行类型--class com.demo.Cat
Cat cat = (Cat)clazz.newInstance();
//(3)得到加载类的对应方法
// ----在反射中 可以把方法视为对象
Method method = clazz.getMethod(methodName);
//(4) 通过方法的调用对象调用方法
System.out.println("=====================");
method.invoke(cat);
//传统方法: 对象.方法(),反射机制 方法.invoke(对象)
反射原理图
反射相关类
//3、getFiled不能得到私有属性
//Field name = clazz.getField("name");//会报错
Field age = clazz.getField("age");
System.out.println(age);
//得到的是public java.lang.Integer com.demo.Cat.age
//要想得到值 传统:对象.成员变量;反射:字段成员对象.get(对象)
System.out.println(age.get(cat));//10
//4、getConstructor()
//无参构造器
Constructor constructor = clazz.getConstructor();
System.out.println(constructor);
//返回public com.demo.Cat()一个无参构造器
//有参构造器-传入一个形参类型的class对象
Constructor constructor1 = clazz.getConstructor(String.class);
System.out.println(constructor1);
//输出public com.demo.Cat(java.lang.String)
反射调优
public static void main(String[] args) throws Exception {
m1();
m2();
m3();
}
//传统方法调用hi
public static void m1(){
Cat cat = new Cat();
long startTime = System.currentTimeMillis();
for (int i = 0; i < 9000000; i++) {
cat.hi();
}
long endTime = System.currentTimeMillis();
System.out.println("传统方法耗时:"+(endTime-startTime));
}
//反射机制hi
public static void m2() throws Exception {
Class clazz = Class.forName("com.demo.Cat");
Object o = clazz.newInstance();
Method hi = clazz.getMethod("hi");
long startTime = System.currentTimeMillis();
for (int i = 0; i < 9000000; i++) {
hi.invoke(o);
}
long endTime = System.currentTimeMillis();
System.out.println("反射耗时:"+(endTime-startTime));
}
//反射优化=关闭访问检查
public static void m3() throws Exception {
Class clazz = Class.forName("com.demo.Cat");
Object o = clazz.newInstance();
Method hi = clazz.getMethod("hi");
hi.setAccessible(true);
long startTime = System.currentTimeMillis();
for (int i = 0; i < 9000000; i++) {
hi.invoke(o);
}
long endTime = System.currentTimeMillis();
System.out.println("反射优化耗时:"+(endTime-startTime));
}