java 通过反射访问成员变量和成员方法

package cn.itcast.demo1;

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

	
	/*static{
		System.out.println("静态代码块");
	}*/
	
	public Person(){
	}
	
	public Person(String name,int age){
		this.name = name;
		this.age = age;
	}
	
	private Person(int age,String name){
		this.name = name;
		this.age = age;
	}
	
	public void eat(){
		System.out.println("人吃饭");
	}

	public void sleep(String s, int a,double d){
		System.out.println("人在睡觉"+s+"....."+a+"....."+d);
	}
	private void playGame(){
		System.out.println("人在打游戏");
	}

	public String toString() {
		return "Person [name=" + name + ", 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;
	}
	
}
package cn.itcast.demo1;

import java.lang.reflect.Constructor;

/*
 *  通过反射获取class文件中的构造方法,运行构造方法
 *  运行构造方法,创建对象
 *    获取class文件对象
 *    从class文件对象中,获取需要的成员
 *    
 *  Constructor 描述构造方法对象类
 */
public class ReflectDemo1 {
	public static void main(String[] args) throws Exception {
	
		Class c = Class.forName("cn.itcast.demo1.Person");
		//使用class文件对象,获取类中的构造方法
		//  Constructor[]  getConstructors() 获取class文件对象中的所有公共的构造方法
		/*Constructor[] cons = c.getConstructors();
		for(Constructor con : cons){
			System.out.println(con);
		}*/
		//获取指定的构造方法,空参数的构造方法
		Constructor con =  c.getConstructor();
		//运行空参数构造方法,Constructor类方法 newInstance()运行获取到的构造方法
		Object obj = con.newInstance();
		System.out.println(obj.toString());
	}
}
package cn.itcast.demo1;

import java.lang.reflect.Constructor;

/*
 *  通过反射,获取有参数的构造方法并运行
 *  方法getConstructor,传递可以构造方法相对应的参数列表即可
 */
public class ReflectDemo2 {
	public static void main(String[] args)throws Exception {
		Class c = Class.forName("cn.itcast.demo1.Person");
		//获取带有,String和int参数的构造方法
		//Constructor<T> getConstructor(Class<?>... parameterTypes)  
		//Class<?>... parameterTypes 传递要获取的构造方法的参数列表
		Constructor con = c.getConstructor(String.class,int.class);
		//运行构造方法
		// T newInstance(Object... initargs)  
		//Object... initargs 运行构造方法后,传递的实际参数
		Object obj = con.newInstance("张三",20);
		System.out.println(obj);
	}
}
package cn.itcast.demo1;
/*
 * 反射获取构造方法并运行,有快捷点的方式
 * 有前提:
 *   被反射的类,必须具有空参数构造方法
 *   构造方法权限必须public
 */
public class ReflectDemo3 {
	public static void main(String[] args) throws Exception {
		Class c = Class.forName("cn.itcast.demo1.Person");
		// Class类中定义方法, T newInstance() 直接创建被反射类的对象实例
		Object obj = c.newInstance();
		System.out.println(obj);
	}
}
package cn.itcast.demo1;

import java.lang.reflect.Field;

/*
 *  反射获取成员变量,并修改值
 *  Person类中的成员String name
 */
public class ReflectDemo5 {
	public static void main(String[] args) throws Exception{
		Class c = Class.forName("cn.itcast.demo1.Person");
		Object obj = c.newInstance();
		//获取成员变量 Class类的方法 getFields() class文件中的所有公共的成员变量
		//返回值是Field[]    Field类描述成员变量对象的类
		/*Field[] fields = c.getFields();
		for(Field f : fields){
			System.out.println(f);
		}*/
		
		//获取指定的成员变量 String name
		//Class类的方法  Field getField(传递字符串类型的变量名) 获取指定的成员变量
		Field field = c.getField("name");
	   
		//Field类的方法 void set(Object obj, Object value) ,修改成员变量的值
		//Object obj 必须有对象的支持,  Object value 修改后的值
		field.set(obj,"王五");
		System.out.println(obj);
		
	}
}
package cn.itcast.demo1;

import java.lang.reflect.Method;

/*
 *  反射获取成员方法并运行
 *  public void eat(){}
 */
public class ReflectDemo6 {
	public static void main(String[] args) throws Exception{
		Class c = Class.forName("cn.itcast.demo1.Person");
		Object obj = c.newInstance();
		//获取class对象中的成员方法
		// Method[] getMethods()获取的是class文件中的所有公共成员方法,包括继承的
		// Method类是描述成员方法的对象
		/*Method[] methods = c.getMethods();
		for(Method m : methods){
			System.out.println(m);
		}*/
		
		//获取指定的方法eat运行
		// Method getMethod(String methodName,Class...c)
		// methodName获取的方法名  c 方法的参数列表
		Method method = c.getMethod("eat");
		//使用Method类中的方法,运行获取到的方法eat
		//Object invoke(Object obj, Object...o)
		method.invoke(obj);
	}
}
package cn.itcast.demo1;

import java.lang.reflect.Method;

/*
 *  反射获取有参数的成员方法并执行
 *  public void sleep(String,int,double){}
 */
public class ReflectDemo7 {
	public static void main(String[] args) throws Exception{
		Class c = Class.forName("cn.itcast.demo1.Person");
		Object obj = c.newInstance();
		//调用Class类的方法getMethod获取指定的方法sleep
		Method method = c.getMethod("sleep", String.class,int.class,double.class);
		//调用Method类的方法invoke运行sleep方法
		method.invoke(obj, "休眠",100,888.99);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值