概述

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);

}