概述
1,why 为了更改私有的属性?
package java01; public class Person { private String name; public int age; private Person(String name) { this.name = name; } public Person(String name, int age) { this.name = name; this.age = age; } public Person(){ } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } public void show(){ System.out.println("hello world"); } private String showNation(String nation){ System.out.println("你的国籍是"+nation); return nation; } } |
---|
//反射之前 @Test public void test1(){ Person p=new Person("Tom",20); System.out.println(p.age); p.show(); //在Person类外部,不可以通过Person类的对象调用其内部私有结构。 //比如:name、showNation()以及私有的构造器 } //反射之后,对Person的操作 @Test public void test2() throws Exception { Class clazz=Person.class; //1.通过反射,创建对象 Constructor cons=clazz.getConstructor(String.class,int.class); Object obj=cons.newInstance("Tom",12); Person p=(Person)obj; System.out.println(p.toString()); //2.通过反射,调用对象指定的属性和方法 //调用属性 Field age=clazz.getDeclaredField("age"); age.set(p,10); System.out.println(p.toString()); //调用方法 Method show=clazz.getDeclaredMethod("show"); show.invoke(p); //通过反射,可以调用Person类的私有结构 //调用私有构造器 Constructor cons1=clazz.getDeclaredConstructor(String.class); cons1.setAccessible(true); Person p1=(Person)cons1.newInstance("Jerry"); System.out.println(p1); //调用私有的属性 Field name=clazz.getDeclaredField("name"); name.setAccessible(true); name.set(p1,"mia"); System.out.println(p1); //调用私有的方法 Method showNation=clazz.getDeclaredMethod("showNation", String.class); showNation.setAccessible(true); String nation=(String)showNation.invoke(p1,"China"); //相当于String nation = p1.showNation("中国") System.out.println(nation); } |
//疑问1:通过直接new的方式或反射的方式都可以调用公共的结构,开发中到底用那个? //建议:直接new的方式。 //什么时候会使用:反射的方式。 反射的特征:动态性 //疑问2:反射机制与面向对象中的封装性是不是矛盾的?如何看待两个技术? //不矛盾。
@Test public void test4(){ Class c1 = Object.class; Class c2 = Comparable.class; Class c3 = String[].class; Class c4 = int[][].class; Class c5 = ElementType.class; Class c6 = Override.class; Class c7 = int.class; Class c8 = void.class; Class c9 = Class.class; int[] a = new int[10]; int[] b = new int[100]; Class c10 = a.getClass(); Class c11 = b.getClass(); // 只要数组的元素类型与维度一样,就是同一个Class System.out.println(c10 == c11); } |
---|