java反射机制与调用&&Class的介绍
定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
java反射是基于Class对象进行操作的,每一个.class通过类加载器加载到内存时,都会生成与之对应的Class对象,并且是唯一的(Class的构造是private)。
Class对象获取的三种方式
- object.getClass():通过该类对象,调用getClass(),生成Class对象
- Object.class:通过类获取Class对象
- Class.forName(“com.example.Test”):通过Class调用forName(),参数是全类名。
注意:TYPE语法
Class c1 = Integer.TYPE;
System.out.println(c1.toString());//打印结果:int
Class类中常用的方法
- forName():静态方法,返回Class对象
- newInsatnce():返回的是本类对象,调用的是无参构造,如果无参构造被private修饰会抛异常
- getName():获取类名全称
- getSuperClass:获取父类
- getClassLoader():获取加载该类的类加载器对象
- getAnnotion():获取该类上面的注解
- getInterface():获取给类的接口
- isInterface():判断是不是接口
- getField():参数String,获取被public修饰某个字段的
- getFileds():获取被public修饰的所有字段
- getDeclaredField():获取被声明过某个的字段
- getDeclaredFields():获取被声明过所有的字段
- getMethod()/getMethods()/getDeclaredMethod()/getDeclaredMethods():与获取Field一样,参数略有不同,详情参考代码
- getConstructor()/getConstructors()/getDeclaredConstructor()/getDeclaredConstructors():
与反射相关的类与常用的方法
Field
- setAccessible(boolean flag):值是true,表示反射的对象应该抑制java语言访问。突破访问权限
- set(Object obj, Object value):参数一:设置值的对象;参数二:表示设置的值。详见代码使用
- setInt():与set()方法相似。
- getModifiers():获取该字段的修饰符
Method
- setAccessible(boolean flag):值是true,表示反射的对象应该抑制java语言访问。突破访问权限
- invoke(Object obj, Object… args):通过反射调用方法,参数一是调用的对象,参数2是可变参数,表示调用的方法的参数的值
- getReturnType():获取返回值类型
- getModifiers():获取该方法的修饰符
Constructor
Modifier
代码实现如下:
User类
package com.example;
public class User {
private String name;
protected int age;
public Integer id;
private User() {
}
public User(String name, int age, Integer id) {
this.name = name;
this.age = age;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
protected boolean isChild(int age) {
return age < 18;
}
private void transform(String name, int age, Integer id) {
this.name = name;
this.age = age;
this.id = id;
}
public static User query(Integer id) {
User user = new User();
user.id = id;
return user;
}
@Override
public String toString() {
return "name:" + name + " age:" + age + " id:" + id;
}
}
Test类:
package com.example;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
User user = new User("ZHANGSAN", 18, 10086);
System.out.println(user.toString());
Class clazz = user.getClass();
Field f = clazz.getDeclaredField("name");
f.setAccessible(true);
f.set(user, "LiSi");
Field f1 = clazz.getField("id");
f1.set(user, 110);
System.out.println(user.toString());
@SuppressWarnings("unchecked")
Method m = clazz.getDeclaredMethod("isChild", int.class);
boolean isChild = (boolean) m.invoke(user, user.age);
if (!isChild) {
@SuppressWarnings("unchecked")
Method m1 = clazz.getDeclaredMethod("transform", String.class, int.class, Integer.class);
m1.setAccessible(true);
m1.invoke(user, "XiaoMing", 20, 119);
}
System.out.println(user.toString());
//静态方法的调用
@SuppressWarnings("unchecked")
Method m2 = clazz.getMethod("query", Integer.class);
User u = (User) m2.invoke(null, 38);
System.out.println(u.toString());
System.out.println(u.getClass() == clazz);//true 每个类的Class对象是唯一的
Class c = Class.forName("java.lang.Integer");
System.out.println(c.toString());
Class c1 = Integer.TYPE;
System.out.println(c1.toString());//打印结果:int
}
}