属性:
//调用运行时类中指定的属性 @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}