JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
下面是反射机制用到的基本的代码:
- ReflectTest 测试反射机制的类
- User 实体类
package com.test.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 测试java反射
* @author zhb
*
*/
public class ReflectTest {
private static void test() throws Exception {
String path = "com.test.reflect.User";
// 获取类信息的方式有三种,三种方式获取的类对象相同;clazz是以后操作的关键
// 第一种方式
Class clazz = Class.forName(path);
// 第二种方式
Class clazz1 = User.class;
// 第三种方式
User u = new User();
Class clazz2 = u.getClass();
System.out.println(clazz.hashCode());
System.out.println(clazz1.hashCode());
System.out.println(clazz2.hashCode());
// 获取类名称包名+类名;
String className = clazz.getName(); // clazz.getSimpleName(); // 只有类名
// 获取clazz构造方法
// 利用无参的构造方法创建对象user, 比较常用
User user = (User) clazz.newInstance();
user.setName("张三");
// 获取有参的构造方法
Constructor<User> constructor = clazz.getConstructor(new Class[]{int.class, String.class});
// 根据获取的有参的构造方法创建一个对象
User user2 = constructor.newInstance(1001, "李四");
System.out.println(user.getName()+"---------"+user2.getName());
// 对属性的操作
// 这样只能获取public的属性
Field[] fields = clazz.getFields();
// 获取所有的属性 declared:公告的
Field[] fields1 = clazz.getDeclaredFields();
// 根据属性的名字获取属性
Field field = clazz.getDeclaredField("name");
// 跳过检查,不然给私有变量赋值会报错,也会提高效率,建议使用
field.setAccessible(true);
field.set(user, "王五");
System.out.println(user.getName());
// 对方法的操作
// 获取所有的公共方法
Method[] methods = clazz.getMethods();
// 获取所有的方法
Method[] methods1 = clazz.getDeclaredMethods();
// 根据指定的名字获取方法, public类型的方法
Method method = clazz.getMethod("hello", String.class);
// 跳过验证 ,提高效率
method.setAccessible(true);
Object result = method.invoke(user, "调用方法");
System.out.println(result);
}
public static void main(String[] args) throws Exception {
test();
}
}
package com.test.reflect;
public class User {
private int id;
private String name;
// 无参的构造方法,容易被忘记
public User(){
}
//有参的构造方法
public User(int id, String name){
this.id = id;
this.name = name;
}
// 类中一个普通的方法
public String hello(String name){
System.out.println("hello:"+ name);
return "方法调用成功";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}