笔记:
/**直接 throws Exception,完美包含全部异常! * --------------------------- * Class: * 首先创建一个类, 接着编译程序: javac(exe) file.java,生成.class文件, * 之后执行程序: java(exe) file ,将此.class文件加载到内存中,就是一个运行时类,存在缓存区; * 每一个运行时类只能加载一次! * ------------------------ * 反射: * 有了反射,可以通过反射创建一个类的对象,并调用其中的结构: * //0.声明Person的class类 * //1.创建clazz对应的运行时类Person 类的对象//newInstance()表示新建一个对象 * // 2.通过反射调用运行时类的指定的属性 * 2.1调用公用属性 getField() * 2.2调用任意属性 getField(),setAccessible(true)设置可更改,然后再set()具体值 * //3.通过反射调用运行时类的指定方法:invoke(p,...) * --------------------- * */
测试代码:
import org.junit.Test; import java.lang.reflect.*; import java.lang.reflect.Method; public class Test1 { @Test public void test3() throws Exception{ Person p=new Person(); Class clazz=p.getClass(); //通过运行时类的对象,调用其getClass() System.out.println(clazz); } //有了反射,可以通过反射创建一个类的对象,并调用其中的结构 @Test public void test2() throws Exception { //0.声明Person的class类 Class clazz = Person.class; //1.创建clazz对应的运行时类Person 类的对象 Person p = (Person) clazz.newInstance(); //newInstance()表示新建一个对象 System.out.println(p); //Person{age=0, name='null'} // 2.通过反射调用运行时类的指定的属性 //2.1调用公用属性 getField() Field f1 = clazz.getField("name"); f1.set(p, "LiuDeHua"); System.out.println(p); //Person{age=0, name='LiuDeHua'} //2.2调用任意属性 getField(),setAccessible(true)设置可更改,然后再set()具体值 Field f2 = clazz.getDeclaredField("age"); f2.setAccessible(true); f2.set(p, 2000); System.out.println(p); //Person{age=2000, name='LiuDeHua'} //3.通过反射调用运行时类的指定方法:invoke(p,...) Method m1=clazz.getMethod("show"); m1.invoke(p); //空参数 Method m2=clazz.getMethod("display",String.class); m2.invoke(p,"CHINA"); //有参数参数 } @Test//在有反射以前,如何创建一个类的对象,并调用其中的方法/属性 public void test1(){ Person p=new Person(); p.setAge(10); p.setName("TangWei"); System.out.println(p); p.show(); p.display("HK"); } } class Person extends Creature<String> implements Comparable,MyInterface { private int age; public String name; public Person() { } public void show(){ System.out.println(this.getClass().getName()+"我是一个人类!"); } public void display(String s){ System.out.print("我的国籍是:"+s); } public Person(int age, String name) { this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person{" + "age=" + age + ", name='" + name + '\'' + '}'; } @Override public int compareTo(Object o) { return 0; } }
输出结果:
Person{age=10, name='TangWei'} 任务222_反射.Person我是一个人类! 我的国籍是:HKPerson{age=0, name='null'} Person{age=0, name='LiuDeHua'} Person{age=2000, name='LiuDeHua'} 任务222_反射.Person我是一个人类! 我的国籍是:CHINAclass 任务222_反射.Person