实体类
public class User {
public Integer age;
protected Long id;
Byte bytes;
private String username;
public User(){}
public User(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String introduce() {
return "name ----- " + username;
}
public static String hello() {
return "Hello World";
}
}
测试方法
/**
* 反射机制:操纵对象的字节码文件
*/
public class ReflexTest {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> userClass = Class.forName("reflex.User");
// 获取Java对象字节码的三种方式
getObjectClass();
// 反射实例化对象
getInstance(userClass);
// 获取对象的方法(普通以及实例)
getMethods(userClass);
// 获取对象的属性
getFields(userClass);
}
/**
* 获取Java对象字节码的三种方式
*/
public static void getObjectClass() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
// 第一种方式: 类名.class
System.out.println(User.class); // class reflex.User
// 第二种方式: 创建对象方法获取其实例
System.out.println(new User().getClass()); // class reflex.User
// 第三种方式: 使用Class类forName(String className)方法
// 其中className就是在java包下的类文件路径
System.out.println(Class.forName("reflex.User")); // class reflex.User
}
/**
* 通过反射实例化对象
*/
public static void getInstance(Class<?> userClass) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
System.out.println(userClass.getClassLoader()); // sun.misc.Launcher$AppClassLoader@18b4aac2
// 注意调用对象字节码文件的newInstance()方法时 如果没有无参构造会报错:java.lang.NoSuchMethodException
System.out.println(userClass.newInstance()); // reflex.User@1b6d3586
// 获取这个对象的所有注解
Annotation[] annotations = userClass.getAnnotations();
for(Annotation annotation : annotations) {
System.out.println("注解: " + annotation);
}
System.out.println(userClass.getTypeName()); // reflex.User
}
/**
* 获取对象的普通方法以及实例(非静态)方法
*/
public static void getMethods(Class<?> userClass) throws ClassNotFoundException {
// 获取这个对象的所有普通方法
Method[] methods = userClass.getMethods();
for (Method method : methods) {
// hello getUsername setUsername introduce wait wait wait equals toString hashCode getClass notify notifyAll
System.out.println("普通method: " + method.getName());
}
// 获取这个对象的所有实例/非静态方法
Method[] declaredMethods = userClass.getDeclaredMethods();
for (Method method : declaredMethods) {
System.out.println("实例/非静态: " + method.getName()); // getUsername setUsername introduce
}
}
/**
* 获取对象的公开属性以及所有属性
*/
public static void getFields(Class<?> userClass) throws ClassNotFoundException {
// 获取对象的公开属性
Field[] fields = userClass.getFields();
for(Field field : fields) {
System.out.println("属性权限: " + field.getModifiers()); // 1
System.out.println("属性类型: " + field.getType()); // class java.lang.Integer
System.out.println("属性名称: " + field.getName()); // age
}
// 获取对象的所有属性
Field[] declaredFields = userClass.getDeclaredFields();
for(Field field : declaredFields) {
// 1 4 0 2
System.out.println("属性权限: " + field.getModifiers());
// class java.lang.Integer | class java.lang.Long | class java.lang.Byte | class java.lang.String
System.out.println("属性类型: " + field.getType());
// age id bytes username
System.out.println("属性名称: " + field.getName());
}
}
}