Java 反射机制的应用实例

版权声明:尊重原创,码字不易,转载需博主同意。 https://blog.csdn.net/qq_34626097/article/details/84935849

1. Java Reflection

  1. Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性和方法

2. Java 反射机制提供的功能

  1. 在运行时判断任意一个对象所属的类
  2. 在运行时构造任意一个类的对象
  3. 在运行时判断任意一个类所具有成员变量和方法
  4. 在运行时调用任意一个对象的成员变量和方法
  5. 生成动态代理

3. Java反射机制研究及应用

  1. java.lang.Class:代表一个类
  2. java.lang.reflect.Method:代表类的方法
  3. java.lang.reflect.Field:代表类的成员变量
  4. java.lang.reflect.Constructor:代表类的构造方法
  5. 等。。。

4. dome

public class TestReflection {
	
	//有了反射,可以通过反射创建一个类对象,并调用其中的结构
	@Test
	public void test2() throws Exception {
		Class<Person> clazz = Person.class;
		
		//1.创建clazz对应的运行时类Person类的对象
		Person p = clazz.newInstance();
		System.out.println(p);// null 0 
		//2.通过反射调用运行时类的指定属性
		//2.1
		Field f1 = clazz.getField("name");
		f1.set(p, "LiuDeHua");
		System.out.println(p);//Person [name=LiuDeHua, age=0]
		
//		Field f2 = clazz.getField("age");//java.lang.NoSuchFieldException: age,如果age的权限修饰符不为public
//		f2.set(p, 30);
//		System.out.println(p);
		//2.2
		Field f2 = clazz.getDeclaredField("age");
		f2.setAccessible(true);//修改set的权限,如没有修改,会报没有权限的错误
		f2.set(p, 30);
		System.out.println(p);//Person [name=LiuDeHua, age=30]
		
		//通过反射调用运行时类的指定方法
		Method m1 = clazz.getMethod("show");//方法名和参数确定一个方法
		m1.invoke(p);
		
		Method m2 = clazz.getMethod("display", String.class);
		m2.invoke(p, "HK");
	}
	
	//在有反射以前,如果创建一个类的对象,并调用其中的方法、属性
	@Test
	public void test1() {
		Person p = new Person();
		p.setAge(20);
		p.setName("Tom");
		System.out.println(p);
		p.show();
		p.display("US");
	}
}

public class Person {
	//2.打开一权限
	public  String name ;
	private int age;
	public Person() {
		super();
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	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;
	}
	public void show () {
		System.out.println("我是一个人");
	}
	public void display(String nation) {
		System.out.println("我的国籍是:" + nation);
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}
  1. 输出
    输出

猜你喜欢

转载自blog.csdn.net/qq_34626097/article/details/84935849