获取Class对象的方式
Test test = new Test();
Class class1 = Test.class;
Class class2 = test.getClass();
try {
Class class3 = Class.forName("com.example.myapplication.test.Test");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//方式4
try {
ClassLoader loader = ClassLoader.getSystemClassLoader();
Class class4 = loader.loadClass("com.example.myapplication.test.Test");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
创建对象的方式
Person person1 = new Person();
Class<Person> clazz = Person.class;
Person person2 = clazz.newInstance();
Constructor<Person> constructor = clazz.getConstructor(String.class, int.class);
Person person3 = constructor.newInstance("libinbin", 28);
注意:newInstance()只能创建无参的对象,并且构造器不能是私有的,其他类能访问!
Constructor
Class.getConstructor(paramerType),只能获取自己和父类的public构造方法
class. getConstructors(),获取自己和父类的所有public构造方法,返回一个数组
clazz.getDeclaredConstructor(paramerType),获取自己的构造方法,包括私有,protected,默认等
clazz.getDeclaredConstructors(),获取自己的所有构造方法,返回一个数组
注意:
如果Constructor是私有,默认,protected修饰的,在访问修饰符之外的地方(如默认修饰,不在同一个包中),需要设置constructor.setAccessible(true),才能使用constructor.newInstance(参数);
例子:
Constructor<Person> constructor = clazz.getDeclaredConstructor(String.class, int.class);
constructor.setAccessible(true);
Person person = constructor.newInstance("libinbin", 28);
Method
Method method = clazz.getMethod(name, paramerType…),获取自己和父类所有的public方法
Method method = clazz.getDeclaredMethod(name, paramerType…),获取自己的方法,包括私有。
返回的method对象,通过method.invoke(obj, paramer),调用其方法。
注意:
如果是静态方法,method.invoke(null, paramer…),不需要传入obj对象
例子:
Class<Person> clazz = Person.class;
try {
Object person = clazz.newInstance();
Method method = clazz.getDeclaredMethod("privateMethod");
method.setAccessible(true); //私有方法添加可访问权限
method.invoke(person);
} catch (Exception e) {
e.printStackTrace();
}
Field
Field field = getField(name); 获取自己和父类的所有public属性
Field field = getDeclaredField(name); 获取自己所有的属性,包括私有,默认,protected
例子
try {
Field name = clazz.getField("value"); //value为私有的静态变量
name.setAccessible(true); //设置访问权限
Object o = name.get(null);//静态变量无需传入obj
name.set(null, 16); //设置私有静态变量
} catch (Exception e) {
e.printStackTrace();
}
缺点
在运行时,会创建很多临时变量