反射的基本原理

反射的基本原理

1.通过反射来获取类

Class<User> user = User.class;
		Class<?> user1 = Class.forName("com.scce.test.User");
		System.out.println(user);
通过反射来获取类的方式总共有三种在我这里只写了两种,其效果和

User user = new User();

的效果是一样的。

运行的效果是:com.scce.test.User

其次我们来判断这两个对象是否为同一个对象

System.out.println(user==user1);

运行的结果为:true

则这两个对象为同一个对象

2.通过反射来获取构造方法

 class3.getConstructor(String.class,int.class);
	        //这个参数表示构造器的class构造器
	        //只能获取公共的构造器
	        //构造方法
	        //构造器中传入参数的class的构造器
	        //如果想要获取私有的方法
	        Constructor<?> a = class3.getDeclaredConstructor(String.class,int.class);
这里要讲的是方法里面传入的参数要为字节码

所以传入的参数要写成

String.class括号里面的内容要和参数列表里面的类型要匹配

class3为对象的字节码.getConstructor()

3.调用所有的构造方法

Constructor<?>[] methods = class3.getConstructors();
	        for(Constructor me:methods){
	        	System.out.println(me);
	        	
	        }
4.调用私有的构造方法

Method method3 = user.getDeclaredMethod("method3",String.class);
		//调用私有的方法的时候应该设置该方法的访问权限
		method3.setAccessible(true);
		//获取当前类的对象 
		//Field[] fields = user.getFields();
		//获取私有的方法
		Field[] fields = user.getDeclaredFields();

5.调用普通方法

Object obj = user.newInstance();//底层的私有属性对象
		//访问公共的方法
		Method  method1= user.getMethod("method2",String.class);
		//invoke是执行的意思
		String a = (String) method1.invoke(obj, "123");
		System.out.println(a);
		Method method3 = user.getDeclaredMethod("method3",String.class);
		//调用私有的方法的时候应该设置该方法的访问权限
		method3.setAccessible(true);
		//获取当前类的对象 
		//Field[] fields = user.getFields();
		//获取私有的方法
		Field[] fields = user.getDeclaredFields();
全部的代码:
public class Demo {
	public static void main(String[] args) throws Exception {
		//反射获取类
		Class<User> user = User.class;
		Class<?> user1 = Class.forName("com.scce.test.User");
		System.out.println(user);
		System.out.println(user==user1);
		System.out.println("=============");
		Object obj = user.newInstance();//底层的私有属性对象
		//访问公共的方法
		Method  method1= user.getMethod("method2",String.class);
		//invoke是执行的意思
		String a = (String) method1.invoke(obj, "123");
		System.out.println(a);
		Method method3 = user.getDeclaredMethod("method3",String.class);
		//调用私有的方法的时候应该设置该方法的访问权限
		method3.setAccessible(true);
		//获取当前类的对象 
		//Field[] fields = user.getFields();
		//获取私有的方法
		Field[] fields = user.getDeclaredFields();
System.out.println("-----------------------------------------");
		for(Field field:fields){
			 System.out.println(field);
		 }
		 Field field = user.getDeclaredField("id");
		 //对属性添加get和set方法                                                      
		 Field field1 = user.getDeclaredField("name");
		 field1.setAccessible(true);
		 System.out.println("-------------------------");
		 System.out.println("name"+field1);
		 Object obj1 = user.newInstance();
		 field1.set(obj1, "ad");
		 System.out.println("----------------------");
		 field1.get(obj1);
		 System.out.println( field1.get(obj1));
		 //单例设计模式:
		 //在整个应用程序中某一个类的对象,有且只有一个对象
		 //懒汉模式、枚举
		 
		 
	}
	public static <T>T createInstance(String className,Class<T> cls){
		try {
			Class<T> clz= (Class<T>)Class.forName(className);
			Object obj = clz.newInstance();
			return (T) obj;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}
}









  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值