Java反射机制--反射概述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xd15010130025/article/details/88716940

一.概念

1. Java Reflection

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

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

  • 在运行时判断任何一个对象所属的类
  • 在运行时构建任意一个类的对象
  • 在运行时判断任意一个类具有的成员变量和方法
  • 在运行时调用任意一个对象的成员变量和方法
  • 生成动态代理

3. 反射相关的主要API:

  • java.lang.Class:代表一个类
  • java.lang.reflect.Method:代表类的方法
  • java.lang.reflect.Field:代表类的成员变量
  • java.lang.reflect.Constructor:代表类的构造方法

4. Class类

  • 特性
    在Object类中定义了下面的办法,此方法被所有的子类继承:
    public final Class getClass()
    以上方法返回值的类型是一个Class类,此类是Java反射的源头,实际上反射从程序的运行结果也很好理解,即:通过对象反射求出类的名称。
    正常方式:引入需要的包类名称 \Longrightarrow 通过new实例化 \Longrightarrow 取得实例化对象
    反射方式:实例化对象 \Longrightarrow getClass()方法 \Longrightarrow 得到完整的包类名称

二.实例

Person类

package test;

public class Person {
   public String name;
   private int age;
   public Person() {
	super();
   } 
   public Person(String name) {
	super();
	this.name = name;
    }
    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("This is class of Person");
	
    }
    public void display (String nation){
    	System.out.println("my nation is:"+nation);
    }
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
    
}

测试类

package test;

import static org.junit.Assert.*;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.junit.Test;

public class TestReflection {
    
	//有了反射,通过反射创建对象,并调用其中的方法
	@Test
	public void test2() throws Exception {
		Class clazz=Person.class;
		//创建class对应的运行时类Person对象
		Person p=(Person) clazz.newInstance();
		//调用属性
		Field f1=clazz.getField("name");
		f1.set(p, "LiuDEHua");
		System.out.println(p);
		
		Field f2=clazz.getDeclaredField("age");
		f2.setAccessible(true);
		f2.set(p, 20);
		System.out.println(p);
		//Method
		Method m1=clazz.getMethod("show");
		m1.invoke(p);
		
		Method m2=clazz.getMethod("display",String.class);
		m2.invoke(p,"CHN");
	}

	
	
	//在有反射以前
	//@Test
	public void test1() {
		Person p=new Person();
		p.setAge(10);
		p.setName("Tony");
		System.out.println(p);
		p.show();
		p.display("HK");
	}

}

运行结果
在这里插入图片描述

源代码

链接:https://pan.baidu.com/s/1Ra5PaU8kSC_NH_D00GeBVw
提取码:36c8
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xd15010130025/article/details/88716940