引出反射机制的要求:
首先有一个配置文件:re.properties
classfullpath=com.hspedu.Cat
method=hi
然后我们需要在reflection.question这包下面的ReflectionQuestion类去访问到配置文件里面的hi方法。
思考怎么做?
来,我们先建项目
配置文件:
名称:re.properties
classfullpath=com.hspedu.Cat
method=hi
com.hspedu包下的Cat类:
package com.hspedu;
public class Cat {
private String name="招才猫";
public void hi(){
//
System.out.println("hi"+name);
}
}
reflection.question包下的ReflectionQuestion类
public class ReflectionQuestion {
public static void main(String[] args) throws Exception {
根据配置文件 re.properties 指定信息,创建Cat对象并调用方法hi
//传统方式 new 对象
/* Cat cat = new Cat();
cat.hi();*/
//1.使用Properties 类,可以读写配置文件
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 = "+classfullpath);
System.out.println("method = "+methodName);
//2.使用这个方法创建对象,行不通。那么我们使用反射机制
//(1).加载类,返回Class类型的对象
Class aClass = Class.forName(classfullpath);
//(2) 通过aClass 得到加载的类 com.hspedu.Cat 的对象实例
Object o = aClass.newInstance();
System.out.println(o.getClass());//class com.hspedu.Cat
/*Cat cat=(Cat) o;
cat.hi();
*/
//通常我们并不知道里面的方法名称,所以此方法不可用
//(3)通过 aClass 得到你加载的类 com.hspedu.Cat 的 methodName "hi" 的方法对象
// 即,在反射中,可以把方法视为对象(万物皆对象)
Method method1 = aClass.getMethod(methodName);
//(4.通过method1 调用方法:即通过方法来实现调用方法)
System.out.println("=============");
method1.invoke(o);//传统 对象.方法() ,反射机制 方法 .invoke(对象)
}
}
用这个方法似乎更麻烦了?平时我们通过new 对象就好了,现在还需要写这么多。其实不然。
试想如果我们再添加一个方法呢?
package com.hspedu;
public class Cat {
private String name="招才猫";
public void hi(){
//
System.out.println("hi"+name);
}
public void cry(){
//
System.out.println("miaoo~~miao~~"+name);
}
}
添加方法后我们使用传统的方法只能去改代码
Cat cat = new Cat();
// cat.hi();
//改为
cat.cry();
但是如果我们用了反射现在只要去改配置文件
classfullpath=com.hspedu.Cat
method=cry
反射机制原理图
在图中的类加载器这一块是JVM java底层的知识,在面试中经常会问,,但是实际应用是我们圈出来标有应用的这一块