java基础之反射

一、三种创建Class文件对象的方法

public class ClassDemo1 {
	//本类主要写了三种创建Class文件对象的方法
	@SuppressWarnings("rawtypes")
	public static void main(String[] args) throws ClassNotFoundException {
		//获取一个类的Class文件对象的三种方式
		// 方法1:通过对象获取
		Person p = new Person();
		Class c1 = p.getClass();
		System.out.println(c1);
		//方法2:通过类名获取
		Class<Person> c2 = Person.class;
		System.out.println(c2);
		//方法3:通过Class类的静态方法forname获取
		Class c3 = Class.forName("cn.ckhd.demo1.Person");
		System.out.println(c3);
		
		//以上创建出的三个Class文件对象都是相当的,因为Class文件对象时唯一的
		System.out.println(c1.equals(c2));
		System.out.println(c1.equals(c3));
		System.out.println(c2.equals(c3));
		System.out.println(c1==c2);
		System.out.println(c1==c3);
		System.out.println(c2==c3);
	}

其中Person类的代码如下:

public class Person {
	public String name;
	private String sex;
	public int age;
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Person(String name, String sex) {
		super();
		this.name = name;
		this.sex = sex;
	}
	@SuppressWarnings("unused")
	private Person(String name,String sex,int age) {
		this.name = name;
		this.sex = sex;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	public void eat() {
		System.out.println("人在吃饭!!!");
		
	}
	public void  eat(String name) {
		System.out.println(name+"在吃饭");
	}
	@SuppressWarnings("unused")
	private void eat(String name,String sex) {
		System.out.println(name+"在吃饭!!"+"性别是:"+sex);
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]";
	}
}

二:反射获取构造方法

public class ConstructorDemo {
	//反射获取构造方法
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static void main(String[] args) throws Exception {
		//获取Person类的Class文件对象
		Class c = Class.forName("cn.ckhd.demo1.Person");
		// 获取Person类的全部的 public 构造器
		Constructor[] con = c.getConstructors();
		for (Constructor constructor : con) {
			System.out.println(constructor);
		}
		
		//获取有两个参数的构造方法
		Constructor co = c.getConstructor(String.class, String.class);
		Object obj = co.newInstance("张三", "男");
		System.out.println(obj);
		
		//获取空参数的构造方法
		Constructor cs = c.getConstructor();
		Object ok = cs.newInstance();
		System.out.println(ok);
		
		//获取构造方法的快捷方式
		//使用前提:被反射的类必须有空参数的构造方法                      构造方法权限必须是public (同号里面可以写默认权限)
		Object okk = c.newInstance();
		System.out.println(okk);
		
		//以下为暴力反射部分,不推荐使用,破坏了程序的封装性和安全性
		//暴力反射获取Person类的所有的构造方法,包括私有的
		Constructor[] bcon = c.getDeclaredConstructors();
		for (Constructor constructor : bcon) {
			System.out.println(constructor);
		}
		
		//暴力反射获取Person类的私有的构造方法
		Constructor bco = c.getDeclaredConstructor(String.class,String.class,int.class);
		//必须使用setAccessible()方法设置为true,取消java语言访问检查
		bco.setAccessible(true);
		Object obco = bco.newInstance("张三","人妖",52);
		System.out.println(obco);
		
	}

}

三:反射获取成员变量

public class FieldDemo {
	//反射获取成员变量
	@SuppressWarnings("rawtypes")
	public static void main(String[] args) throws Exception {
		Class c = Class.forName("cn.ckhd.demo1.Person");
		Object obj = c.newInstance();
		//获取Person类所有的public的成员变量
		Field[] fall = c.getFields();
		for (Field field2 : fall) {
			System.out.println(field2);
		}
		
		//获取Person类中的单独的 一个 成员变量,并调用Field里面的set方法设置其值
		Field fsome = c.getField("name");
		fsome.set(obj, "张三");
		System.out.println(obj);
		
		//暴力反射
		//获取Person类的全部的成员变量,包括私有的
		Field[] bfall = c.getDeclaredFields();
		for (Field field : bfall) {
			System.out.println(field);
		}
		
		//暴力反射,获取Person类的一个私有的成员变量并设置其值
		Field bfsome = c.getDeclaredField("sex");
		//反射的对象使用时取消java语言访问性检查
		bfsome.setAccessible(true);
		bfsome.set(obj, "男");
		System.out.println(obj);
		
	}

}

四:反射获取成员方法

public class MethodDemo {
	//反射获取成员方法		
	@SuppressWarnings("unchecked")
	public static void main(String[] args) throws Exception {
		@SuppressWarnings("rawtypes")
		Class c = Class.forName("cn.ckhd.demo1.Person");
		
		Object obj = c.newInstance();
		//反射获取Person类所有的 public 方法,包括继承的方法,不包括构造方法
		Method[] method = c.getMethods();
		for (Method method2 : method) {
			System.out.println(method2);
		}
		
		//反射获取某个成员方法并运行
		Method m1 = c.getMethod("eat", String.class);
		m1.invoke(obj, "李四");
		
		//暴力反射
		//暴力反射获取Person全部的方法,包括私有的,其中继承的方法很构造方法不会获取到
		Method[] bmethod = c.getDeclaredMethods();
		for (Method method2 : bmethod) {
			System.out.println(method2);
		}
		
		//暴力反射获取Person类的私有的方法并运行
		Method bm1 = c.getDeclaredMethod("eat", String.class,String.class);
		bm1.setAccessible(true);
		bm1.invoke(obj, "王五","未知");
		
		
	}

}

五:通过配置文件获取需要反射的对象

public class ConfigurationFile {
	@SuppressWarnings("rawtypes")
	public static void main(String[] args) throws Exception {
		FileReader fr = new FileReader("config.properties");
		Properties pp = new Properties();
		pp.load(fr);
		String className = pp.getProperty("className");
		String methodName = pp.getProperty("methodName");
		Class c = Class.forName(className);
		@SuppressWarnings("unchecked")
		Method m1 = c.getMethod(methodName);
		m1.invoke(c.newInstance());
		
	}
}

配置文件书写如下

#className=cn.ckhd.demo5.Student
#methodName=study
className=cn.ckhd.demo5.Worker
methodName=work

如有错误恳请各位大佬批评指教!!!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值