Java反射代码

package Reflect;

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

public class test {
	/*
	 * 全类名:包名.类名
	 * Class类的三种获取方法
	      1、通过类静态class属性获得Class对象,或者使用实例化对象的getClass()方法
	      2、 使用Class.forName(全类名String)获得类Class静态属性
	      3、使用this.getClass().getClassLoader()获取类加载器(ClassLoader类),
		          使用ClassLoader类loadClass(全类名String)方法获取Class对象
		          
	 * Class:可以获得实例化对象,或者获得属性类Field,方法类Method
	 * newInstance():获取实例化对象,该类需要有无参构造方法
	 * getField(String name):根据属性名获取公共属性(public)对象Field
	 * getFields():获取所有公共属性(public)对象Field数组
	 * getDeclaredField(String name):根据属性名可获取所有属性(private、protected、public)对象Field
	 * getDeclaredFields():获取所有属性(private、protected、public)对象Field数组
	 * getMethod(String name,Class[] parameterTypes):根据方法名,方法传入参数Class数组获取公共
	 *                                               方法对象(public)Method
	 * getMethods():获取所有公共方法(public)对象Method数组
	 * getDeclaredMethod(String name,Class[] parameterTypes):根据方法名,方法传入参数Class数组可获取所有
	 *                                                       方法(private、protected、public)对象Method
	 * getDeclaredMethods():获取所有方法(private、protected、public)对象Method数组
	 * 
	 * 
	 * Field:属性类
	 * set(Object,T value):设置Object实例化对象的属性值为T
	 * setAccessible(true):设置私有属性可被外部反射修改
	 * get():返回当前属性值
	 * 
	 * 
	 * Method:方法类
	 * setAccessible(true):设置私有方法可被外部反射调用
	 * invoke(String methodName,Object[] parameterValue):调用当前方法,methodName为方法名,
	 *                                                   parameterValue为传入参数,返回值为方法返回值
	 */
	public static void main(String[] args) throws Exception {
		//Class类的三种获取方法
		//通过类静态class属性获得Class对象,或者使用实例化对象的getClass()方法,或者
		//使用Class.forName(全类名String)获得类Class静态属性,或者
		//使用this.getClass().getClassLoader()获取类加载器(ClassLoader类),使用ClassLoader类loadClass(全类名String)方法获取
		Class clazz=Person.class;
		System.out.println(clazz.getName());
		
		//通过Class对象newInstance()方法获得实例化对象
		Person person=(Person) clazz.newInstance();
		
		//获得变量(公共变量用getField方法,私有变量、保护变量用getDeclaredField方法,同时)
		Field field=clazz.getField("name");
		field.set(person, "小明");//使用Field对象的set(Object,XXX)方法:Object为具体实例化对象,XXX为修改值
		
		Field field2=clazz.getDeclaredField("age");	//获取私有变量、保护变量方法,也可以获取公共变量
		Field field3=clazz.getDeclaredField("name");//
		
		
		field2.setAccessible(true);					//使得私有变量可被修改
		field2.set(person, 12);
		field3.set(person, "小红");
		//获得方法
		Method display=clazz.getMethod("display");
		//使用Method对象的invoke调用方法
		display.invoke(person);
		
		//person.setAge(13);
		System.out.println(person.toString());
		
		//读取配置文件,获得Properties对象,利用方法getProperty(String key)获取value值
		ReflectTool reflectTool=new ReflectTool();
		Properties properties=reflectTool.getProperties("Reflect/my.properties");
		System.out.println(properties.getProperty("username"));

		test2();
	}
	private static void test2() throws Exception {
		Class clazz=Class.forName("Reflect.Person");
		Field[] field=clazz.getDeclaredFields();
		for (int i = 0; i < field.length; i++) {
			System.out.println(field[i].toString());
		}
	}

}

class Person{
	public String name;
	private int age;
	public Person() {

	}
	public Person(String name, int age) {
		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 display() {
		System.out.println("这是一个人");
	}
	public int display(int age,String name) {
		System.out.println("这是一个人");
		return 1;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值