反射就是Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息。
反射是为了解决在运行期,对某个实例一无所知的情况下,如何调用其方法。
测试用User类
public class User {
public final static String TEST = "static test";
private Integer id;
private String name;
// 公有无参构造函数
public User(){
}
// 私有有参构造函数
private User(Integer id, String name){
this.id = id;
this.name = name;
}
// 公有方法
public String sayHelloPublic(String name) {
System.out.println("hello public " + name);
return name;
}
// 私有方法
private String sayHelloPrivate(String name) {
System.out.println("hello private " + name);
return name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return this.id + " " + this.name;
}
}
反射测试:
1. 反射创建对象,公有无参构造函数
@Test
public void reflectObject(){
User user;
try{
user = (User) Class.forName("com.shpun.reflect.User").newInstance();
user.setId(1);
user.setName("张三");
System.out.println(user);
}catch (Exception e) {
e.printStackTrace();
}
}
2. 反射创建对象,私有有参构造函数
@Test
public void reflectObjectParam(){
User user;
try{
Constructor<?> constructor = Class.forName("com.shpun.reflect.User")
.getDeclaredConstructor(Integer.class, String.class);
// 设置该方法可访问
constructor.setAccessible(true);
user = (User) constructor.newInstance(1, "张三");
System.out.println(user);
}catch (Exception e) {
e.printStackTrace();
}
}
3. 反射公有属性
@Test
public void reflectPublicField(){
User user;
try{
Class<?> cls = Class.forName("com.shpun.reflect.User");
Field field = cls.getField("TEST");
user = (User) cls.newInstance();
String test = (String) field.get(user);
System.out.println(test);
}catch (Exception e){
e.printStackTrace();
}
}
4. 反射私有属性
@Test
public void reflectPrivateField(){
User user;
try{
Class<?> cls = Class.forName("com.shpun.reflect.User");
Field field = cls.getDeclaredField("name");
// 设置该属性可访问
field.setAccessible(true);
user = (User) cls.newInstance();
user.setId(1);
user.setName("张三");
String name = (String) field.get(user);
System.out.println(name);
}catch (Exception e){
e.printStackTrace();
}
}
5. 反射公有方法
@Test
public void reflectPublicMethod(){
User user;
try{
Class<?> cls = Class.forName("com.shpun.reflect.User");
Method method = cls.getMethod("sayHelloPublic", String.class);
user = (User) cls.newInstance();
Object returnObj = method.invoke(user, "张三");
System.out.println(returnObj);
}catch (Exception e) {
e.printStackTrace();
}
}
6. 反射私有方法
@Test
public void reflectPrivateMethod(){
User user;
try{
Class<?> cls = Class.forName("com.shpun.reflect.User");
Method method = cls.getDeclaredMethod("sayHelloPrivate", String.class);
// 设置该方法可访问
method.setAccessible(true);
user = (User) cls.newInstance();
Object returnObj = method.invoke(user, "张三");
System.out.println(returnObj);
}catch (Exception e) {
e.printStackTrace();
}
}