反射_Class_获取Field、 反射_获取Constructor
反射_Class_获取Field
案例:
public class Test3 {
/**
* * 3.获取成员方法们:
* * *Method[] getMethods() :获取成员方法
* * Method getMethod( string name,类<?>... parameterTypes)
* * Method[] getDeclaredMethods()
* * *Method getDeclaredMethod (String name,类<?>. .. parameterTypes)
* * <p>
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Class<Student> aClass = Student.class;
Method eat = aClass.getMethod("eat");
System.out.println(eat);
Student student = new Student();
Object invoke = eat.invoke(student);
System.out.println(invoke);
System.out.println("---");
for (Method method : aClass.getMethods()) {
System.out.println(method);
String name = method.getName();
System.out.println(name); //获取方法名称
}
// 最后还有一个 获取类名的方法 我们来展示一下
System.out.println("------------------");
String name = aClass.getName();
System.out.println(name);
}
}
运行结果:
反射_获取Constructor
学了这么多方法,我们还是没有体验到反射的灵魂,那么我们来写一个案例:
需求:写一个框架,可以帮我们创建任意类的对象,并执行其中的隐藏方法
案例:
public class ReflectTest {
// 可以创建任意类的对象和任意的方法
public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
/**
* 以前我们调用方法的时候,直接创建对象调用方法即可
* 但是假如我们现在 在写一个框架(软件的半成品)
* 给你个需求:前提不能改变任意代码,可以创建任意的类,调用任意的方法
* 实现:
* 1,配置文件
* 2,反射
* 步骤:
* 1.将需要创建的对象的全类名和需要执行的方法定义在配置文件中
* 2.在程序中加载读取配置文件
* 3.使用反射技术来加载类文件进内存
* 4.创建对象
* 5.执行方法
*
*/
// Student student = new Student();
// student.eat();
// System.out.println(student);
// 1加载配置文件
Properties properties = new Properties();
ClassLoader classLoader = ReflectTest.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("ste.properties");
properties.load(is); //获取文件的路径
// 2.获取配置文件定义的数据
String className = properties.getProperty("className");
String methodName = properties.getProperty("methodName");
// 加载该类进入内存
Class<?> aClass = Class.forName(className);
// 创建对象
Object o = aClass.newInstance();
// 获取方法对象
Method method = aClass.getMethod(methodName);
Object invoke = method.invoke(o);
System.out.println(invoke);
}
}
配置文件:
className=Fanse.Student;
methodName=eat;