属性:
//调用运行时类中指定的属性 @Test public void test3() throws Exception { Class clazz = Person.class; //1.获取指定的属性 //getField(String fieldName):获取运行时类中声明为public的指定属性名为fieldName的属性 Field name = clazz.getField("name"); //2.创建运行时类的对象 Person p = (Person) clazz.newInstance(); System.out.println(p); //3.将运行时类的指定的属性赋值 name.set(p, "Jerry"); System.out.println(p); System.out.println(); //getDeclaredField(String fieldName)获取运行时类中指定名为fieldName的属性 Field age = clazz.getDeclaredField("age"); //由于属性权限修饰符的限制,为了保证可以给属性赋值,需要在操作前是的此属性可被操作 age.setAccessible(true); //可访问的 age.set(p, 10); System.out.println(p); // Field id = clazz.getField("id"); }结果:
Person{name='null', age=0}
Person{name='Jerry', age=0}Person{name='Jerry', age=10}
方法:
//调用运行时类中的指定方法 @Test public void test3() throws Exception { Class clazz = Person.class; //getMethod(String name, Class<?>... parameterTypes):获取运行时类中声明为public的指定的方法 Method m1 = clazz.getMethod("show"); Person p = (Person) clazz.newInstance(); //调用指定的方法:Object invoke(Object obj, Object... args) Object returnVal = m1.invoke(p);//我是一个人! System.out.println(returnVal);//null Method m2 = clazz.getMethod("toString"); Object returnVal1 = m2.invoke(p); System.out.println(returnVal1); //Person{name='null', age=0} //对于运行时类中静态方法的调用 Method m3 = clazz.getMethod("info"); m3.invoke(Person.class); //getDeclaredMethod(String name, Class<?>... parameterTypes)获取运行时类中声明了的指定的方法 Method m4 = clazz.getDeclaredMethod("display", String.class, Integer.class); m4.setAccessible(true); Object value = m4.invoke(p, "CHN", 10);//我的国籍是CHN System.out.println(value); //10 }结果:
我是一个人!
null
Person{name='null', age=0}
中国人!
我的国籍是CHN
10
构造器:
//调用指定的构造器 @Test public void test3() throws Exception { String className = "com.peter.java19.Person"; Class clazz = Class.forName(className); Constructor cons = clazz.getDeclaredConstructor(String.class, int.class); cons.setAccessible(true); Person p = (Person) cons.newInstance("小明", 23); System.out.println(p); }结果:
Person{name='小明', age=23}
本文深入探讨Java反射机制,包括如何通过反射获取并操作类的属性、方法和构造器。演示了如何获取并设置属性值,调用不同类型的类方法,以及实例化对象。通过实例代码,读者可以了解到反射在动态操作类成员时的强大功能。
130

被折叠的 条评论
为什么被折叠?



