Java的反射
定义:Java反射机制在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java的反射机制。
简单的说,Java可以把类的属性和方法映射成一个个对象并使用。
常用的反射的方法
- getDeclaredMethod
- getMethod
- Method.invoke(Object obj, Object… args)
- getDeclaredField
- getField
getDeclaredMethod 与getMethod区别
- getDeclaredMethod可以获取类自己的所有方法(private,public,protected,默认包权限),类继承的方法与实现接口的方法是获取不到的
- 使用getMethod可以获取public的方法、继承的方法、实现的接口的方法
- 其它命名规则类似的方法区别相同(getDeclaredField与getField)
一个小栗子
Robot类
利用反射访问其方法与属性的ReflectSample类
Robot:
package com.nanmu.design.pattern.creational.singleton.reflect;
/**
* @author ymn
* @date 2022/5/10
* @description
*/
public class Robot {
private String name;
public void sayHi(String helloSentence){
System.out.println(helloSentence + " " + name);
}
private String throwHello(String tag){
return "Hello " + tag;
}
}
ReflectSample:
package com.nanmu.design.pattern.creational.singleton.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author ymn
* @date 2022/5/10
* @description 反射例子
*/
public class ReflectSample {
public static void main(String[] args) throws Exception {
//使用Class.forName方法加载类
Class c = Class.forName("com.nanmu.design.pattern.creational.singleton.reflect.Robot");
System.out.println("ClassName:" + c.getName());
//创建对象实例
Robot robot = (Robot) c.newInstance();
//getDeclaredMethod可以获取类自己的所有方法(private,public,protected,默认包权限),类继承的方法与实现接口的方法是获取不到的
Method throwHello = c.getDeclaredMethod("throwHello", String.class);
//设置方法为可访问的
throwHello.setAccessible(true);
Object throwHelloResult = throwHello.invoke(robot, "HT");
System.out.println("throwHello方法返回的结果是:" + throwHelloResult);
//使用getMethod可以获取public的方法、继承的方法和实现的接口的方法
Method sayHi = c.getMethod("sayHi", String.class);
sayHi.invoke(robot, "Welcome");
//获取私有属性并设置值
Field name = c.getDeclaredField("name");
name.setAccessible(true);
name.set(robot,"Alice");
//再次调用sayHi方法
sayHi.invoke(robot, "Welcome");
}
}
ReflectSample main方法执行结果为:
ClassName:com.nanmu.design.pattern.creational.singleton.reflect.Robot
throwHello方法返回的结果是:Hello HT
Welcome null
Welcome Alice
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)