Java反射

java 反射

package fanshe;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class 反射大法 {
	static String 静态属性="静态属性内容";
	String 动态属性="动态属性内容";
	int i=11;
	public 反射大法(){
		System.out.println("构造函数 --无参数");
	}
	public 反射大法(String text){
		System.out.println("构造函数 --有参数:"+text);
	}
	public static void 公开_静态_无参_无返回(){
		
		System.out.println("公开_静态_无参_无返回");
	}
	public static void 公开_静态_有参_无返回(String text){
		System.out.println("公开_静态_无参_无返回:"+text);
	}
	public static String 公开_静态_有参_有返回(String text){
		return "公开_静态_无参_无返回:"+text;
	}
	private String 私有_动态_有参_有返回(String text){
		return "公开_静态_无参_有返回:"+text;
	}
	/*
	 * ********* getConstructor()和getDeclaredConstructor()区别:*********

	getDeclaredConstructor(Class<?>... parameterTypes) 
	这个方法会返回制定参数类型的所有构造器,包括public的和非public的,当然也包括private的。
	getDeclaredConstructors()的返回结果就没有参数类型的过滤了。

	再来看getConstructor(Class<?>... parameterTypes)
	这个方法返回的是上面那个方法返回结果的子集,只返回制定参数类型访问权限是public的构造器。
	getConstructors()的返回结果同样也没有参数类型的过滤。
	 * 
	 * Declared  代表获取所有  不加 代表仅仅获取公开
	 * 
	 * */
	
	
	
	public static void 反射构造函数无参例子() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		反射大法 p=new 反射大法();
		//获取class 字节码的4种方法  实例对象.getclass 类.class class.forname(包名+类名) 类.TYPE
		Class 类字节码=p.getClass();
		//根据字节码获取方法对象
		//===============根据实例的对象 重新实例并获取该对象
		Constructor 构造方法=类字节码.getConstructor();//若获取的方法有参数 直接传入参数类型的字节码 int.class
		反射大法 t=(反射大法) 构造方法.newInstance();//若有参数 直接传入
		//根据构造函数得到对象 可以调用原对象所有方法
		System.out.println(t.私有_动态_有参_有返回("ooooo"));
		
		
	}
	public static void 反射构造函数有参例子() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		反射大法 p=new 反射大法();
		//获取class 字节码的三种方法  实例对象.getclass 类.class class.forname(包名+类名)
		Class 类字节码=p.getClass();
		//根据字节码获取方法对象
		//===============根据实例的对象 重新实例并获取该对象
		Constructor 构造方法=类字节码.getConstructor(String.class);//若获取的方法有参数 直接传入参数类型的字节码 int.class
		反射大法 t=(反射大法) 构造方法.newInstance("突突突突突突拖拖拖");//若有参数 直接传入
		System.out.println(t.getClass().getName());
		
	}
	public static void 反射获取属性例子() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException{
		反射大法 p=new 反射大法();
		//获取class 字节码的三种方法  实例对象.getclass 类.class class.forname(包名+类名)
		Class 类字节码=p.getClass();
		//根据字节码获取方法对象
		//===============
		Field 属性=类字节码.getField("动态属性");//获取属性
		//操作属性    私有属性需要设置可访问权限 setaccessible
		//pass
		
	}
	public static void 反射获取公开_静态_无参_无返回_方法例子() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		反射大法 p=new 反射大法();
		Class 类字节码=p.getClass();
		//不清楚对象类型 用object   清楚用对象类型要强转   创建对象
		反射大法 方法实例对象=(反射大法) 类字节码.getDeclaredConstructor().newInstance();
		System.out.println("==============");
		Method 方法=类字节码.getMethod("公开_静态_无参_无返回");//有参数填入参数类型
		System.out.println("==============");//method.setAccessible(true);私有属性设置
		方法.invoke(方法实例对象);//有参数 填入参数内容
		
	}
	public static void 反射获取公开_静态_有参_无返回_方法例子() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		反射大法 p=new 反射大法();
		Class 类字节码=p.getClass();
		//不清楚对象类型 用object   清楚用对象类型要强转   创建对象
		反射大法 方法实例对象=(反射大法) 类字节码.getDeclaredConstructor().newInstance();
		System.out.println("==============");
		Method 方法=类字节码.getMethod("公开_静态_有参_无返回",String.class);//有参数填入参数类型
		System.out.println("==============");//method.setAccessible(true);私有属性设置
		方法.invoke(方法实例对象,"嘿嘿嘿嘿嘿");//有参数 填入参数内容   invoke 方法 有返回值具体看执行方法
		
	}
	
	public static void 反射查询所有方法(){
		反射大法 p=new 反射大法();
		Class 类字节码=p.getClass();
		//查询类中所有犯法
		System.out.println("获取方法列表=============");
		Method[] 方法数组=类字节码.getMethods();
		for(Method x:方法数组){
			System.out.println(x);
		}
		System.out.println("结束========================");
	}
	public static void 反射查询所有属性(){
		反射大法 p=new 反射大法();
		Class 类字节码=p.getClass();
		//查询类中所有犯法
		System.out.println("获取属性列表=============");
		Field[] 属性数组=类字节码.getDeclaredFields();
		for(Field x:属性数组){
			System.out.println(x.getName()+x.getType().getName());
		}
		System.out.println("结束========================");
	}
	public static void 反射获取私有属性值() throws NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException{
		反射大法 p=new 反射大法();
		Class 类字节码=p.getClass();
		//查询类中所有犯法
		//Field对象的获得
		//Field[] fields = c.getFields();//取得所有public属性(包括父类继承)   有bug
		//Field[] fields = c.getDeclaredFields();//取得所有声明的属性
		
		Field 属性=类字节码.getDeclaredField("静态属性");
		反射大法 属性实例对象 = (反射大法)类字节码.getConstructor().newInstance();
		//设置可访问权限
		属性.setAccessible(true);
		System.out.println(属性.get(属性实例对象));//获取内容
		属性.set(属性实例对象, "反射设置新内容666666666666");//修改内容
		System.out.println(属性.get(属性实例对象));
	}
	public static void getinterfaces() throws ClassNotFoundException{
		//获取类实现的所有接口
		Class c =Class.forName("java.util.ArrayList");
		Class[] in=c.getInterfaces();
		for(Class x:in){
			System.out.println(x.getName());
		}
	}
	public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
		反射构造函数无参例子();	
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值