@TOC
HelloWorld.java -> javac -> HelloWorld.class
Class clz = HelloWorld.class
public class ReflexTest {
public static void main(String[] args) throws ClassNotFoundException {
//1.类名.class 获取
Class<User> userClass1 = User.class;
System.out.println(userClass1);
//2.对象获取
User user = new User();
Class<? extends User> userClass2 = user.getClass();
System.out.println(userClass2);
//3.全限定名称获取,Class.forName
Class<?> userClass3 = Class.forName("com.lixiang.reflex.User");
System.out.println(userClass3);
//4.通过classLoader类加载器
ClassLoader classLoader = ReflexTest.class.getClassLoader();
Class<?> userClass4 = classLoader.loadClass("com.lixiang.reflex.User");
System.out.println(userClass4);
}
}
public class User {
private String name;
private int age;
}
public class ReflexTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
//1.类名.class 获取
Class<User> userClass = User.class;
Constructor<?>[] declaredConstructors = userClass.getDeclaredConstructors();
//获取本类的全部构造方法
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor.getName() + " "+ declaredConstructor.getParameterCount());
}
System.out.println("--------------------");
//获取String类型的高燥方法
Constructor<User> declaredConstructor = userClass.getDeclaredConstructor(String.class);
System.out.println(declaredConstructor.getName() + " "+ declaredConstructor.getParameterCount());
}
}
方法名 | 说明 |
---|---|
| 根据类的空参的构造器创建对象,类必须提供空参的构造器和public权限 |
| 根据指定的构造方法创建对象 |
Class
对象Constructor
的实例Constructor
的实例创建对应类的对象,并初始化类属性public class ReflexTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//1.类名.class 获取
Class<User> userClass = User.class;
//创建无参User对象
Constructor<User> userConstructor1 = userClass.getDeclaredConstructor();
User user = userConstructor1.newInstance();
System.out.println(user);
System.out.println("-----------------------");
//创建一个参数的对象
Constructor<User> userConstructor2 = userClass.getDeclaredConstructor(String.class);
User user1 = userConstructor2.newInstance("李祥");
System.out.println(user1);
}
}
方法 | 说明 |
---|---|
| 获取当前运行类和 父类中声明的方法,需要是public访问权限的方法 |
| 获取当前运行时类中声明的全部方法,不包含父类中声明的方法 |
方法 | 说明 |
---|---|
| 获取全部的返回值 |
| 获取全部的参数 |
| 获取修饰符 |
| 获取异常信息 |
public class ReflexTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//获取类对象
Class<User> clazz = User.class;
//获取当前运行类和 父类中声明的方法,需要是public访问权限的方法
Method[] methods = clazz.getMethods();
for(Method method:methods){
System.out.println("修饰符="+method.getModifiers()+",返回值="+method.getReturnType().getName()+",整体="+method);
}
System.out.println("——————————————————");
//返回当前类中所有的方法,无视修饰符
Method[] declaredMethods = clazz.getDeclaredMethods();
for(Method method:declaredMethods){
System.out.println("修饰符="+method.getModifiers()+",返回值="+method.getReturnType().getName()+",整体="+method);
}
}
}
方法名 | 说明 |
---|---|
| 获取当前运行类和 父类中声明的属性,需要是public访问权限的属性 |
| 获取当前运行时类中声明的全部属性,不包含父类中声明的属性 |
方法 | 说明 |
---|---|
| 整数形式返回此 |
| 返回 Field的属性类型 |
| 返回 Field的名称 |
public class ReflexTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//获取类对象
Class<User> clazz = User.class;
//都是private,则获取不了; 属性改为public才行
Field[] fields = clazz.getFields();
for(Field field:fields){
System.out.println("属性名="+field.getName()+",属性类型="+field.getType().getName()+",属性修饰符="+field.getModifiers());
}
System.out.println("——————————————————");
// 获取当前运行时类中声明的全部属性,不包含父类中声明的属性
Field[] declaredFields = clazz.getDeclaredFields();
for(Field field:declaredFields){
System.out.println("属性名="+field.getName()+",属性类型="+field.getType().getName()+",属性修饰符="+field.getModifiers());
}
}
}
setAccessible(true)
,修改访问权限,Method和Field、Constructor对象都有setAccessible()方法public class ReflexTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//获取类对象
Class<User> clazz = User.class;
//获取public空构造函数,并创建对象(把构造函数private私有化)
Constructor<User> declaredConstructor = clazz.getDeclaredConstructor();
//修改访问权限,true表示暴力反射,攻破权限
declaredConstructor.setAccessible(true);
User user = declaredConstructor.newInstance();
user.setAge(11);
user.setName("李祥");
System.out.println(user);
}
}
方法 | 说明 |
---|---|
| 获取取指定对象 |
| 设置指定对象 |
public class ReflexTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
Class clazz = User.class;
//创建运行时类的对象
//获取类对象
//获取public空构造函数,并创建对象
Constructor<User> declaredConstructor = clazz.getDeclaredConstructor();
//修改访问权限,true表示保留反射
declaredConstructor.setAccessible(true);
//创建对象
User user = declaredConstructor.newInstance();
System.out.println(user.toString());
//获取运行时类中指定变量名的属性
Field name = clazz.getDeclaredField("name");
//保证当前属性是可访问的
name.setAccessible(true);
//设置指定对象的的属性值
name.set(user,"李祥");
//打印对象的name属性值
System.out.println(name.get(user));
System.out.println(user.toString());
}
}
Object invoke(Object obj, Object … args)
public class ReflexTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
//获取类对象
Class<User> clazz = User.class;
//获取public空构造函数,并创建对象
Constructor<User> declaredConstructor = clazz.getDeclaredConstructor();
//确保有访问权限,true表示暴力反射
declaredConstructor.setAccessible(true);
User user = declaredConstructor.newInstance();
user.setName("李祥");
System.out.println("—————————调用普通方法———————————");
//获取指定的某个方法, 参数1,指明获取的方法的名称 参数2,指明获取的方法的形参列表
Method say = clazz.getDeclaredMethod("say", String.class);
//保证当前方法是可访问的
say.setAccessible(true);
//invoke调用,参数1 方法的调用者 参数2 给方法形参赋值的实参,
// 返回值 是 对应类中调用的方法的返回值。
Object returnValue = say.invoke(user, "李祥");
System.out.println(returnValue);
System.out.println("—————————调用静态方法———————————");
//获取指定的某个方法, 参数1,指明获取的方法的名称 参数2,指明获取的方法的形参列表
Method sleepMethod = clazz.getDeclaredMethod("sleep",String.class);
//保证可以访问
sleepMethod.setAccessible(true);
//调用静态方法,不需要获取类对象。
Object returnValue2 = sleepMethod.invoke(null,"李祥");
//如果调用的运行时类中的方法没有返回值,则此invoke()返回null
System.out.println(returnValue2);
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。