• Java反射


    一、Java反射的使用场景

    临时仅仅用过通过配置文件的className来创建对象。

    “非常多人都认为。既然都知道类名,为什么不直接new出来。然后调用方法。搞反射太麻烦了,并且一点用都没有?”对于这个问题,我认为有须要看框架的应该得懂。由于框架实用到,尽管我还没有学习。但在网上看到过这方面问答,所以就冒昧写出来了


    二、基础知识

    2.1 通过反射得到className的方式
    		class.forName()
    		类.class()方法
    		实例化的类.getClass()方法
    	
    2.2 通过ClassName实例化对象的方式
    		通过class的newInstance的方法
    		通过Constructor来创建
    		他们的差别在于。前者仅仅能实例化无參的实例化对象,后者兼容各种參数的实例化对象,当然还包含无參的
    	
    2.3 经常使用类
    		Method跟类的方法挂钩
    		Field跟类的字段挂钩
    		Constructor跟类的构造方法挂钩
    	
    2.4 经常用法
    		Method.getMethod()获取public的类方法,局限性非常大
    		Method.getDeclaredMethod()用法跟上面一样,但除了public方法。还能够获取private方法
    		假设你尝试使用getMethod()方法来获取private方法,那么将会提示你NoSuchMethodException()
    		其余的Field方法同上

    、详细实例

    实现功能:訪问类的私有方法。并将值打印出来

    提供私有方法的类

    public class BeiTest1 {
    	public int myself=12;
    	
    	private int getchina(){
    		return myself;
    	}
    }

    操作类


    public class ReflectTest1 {
    	public static void main(String[] args) throws Exception{
    		BeiTest1 test=new BeiTest1();
    		//在这里能够使用newInstance或者Constractor来创建实例
    		Class<?> classType=test.getClass();
    		//使用getMethod将不能訪问private方法。假设訪问了将会抛出java.lang.NoSuchMethodException异常。兴许也就得不到执行
    		Method method=classType.getDeclareMethod("getchina",new Class[]{});
    		//设置是否启用訪问检測,假设为true则表示不检測。也就表示能够訪问
    		method.setAccessible(true);
    		Integer aaa=(Integer)method.invoke(test, new Object[]{});
    		System.out.println("结果是"+aaa);
    	}
    }

    实现功能:将某个对象中的字段提取出来。保存到另外一个新建对象中。然后打印出来


    class BeiTestCopy{
    	int age;
    	String name;
    	
    	public BeiTestCopy(int a,String n) {
    		this.age=a;
    		name=n;
    	}
    }


    详细操作类

    public class ReflectCopyTest {
    	public static void main(String[] args) throws Exception{
    		//模拟初始化对象
    		BeiTestCopy testcopy=new BeiTestCopy(35,"张三");
    		//调用函数,将通用的Object强转
    		BeiTestCopy mycopy=(BeiTestCopy) copyObject(testcopy);
    		//打印copy回来的数据
    		System.out.println(mycopy.name+"今年"+mycopy.age);
    	}
    	public static Object copyObject(Object o) throws Exception{
    		//获取对象中的各个字段的值
    		Class<?

    > classType=o.getClass(); //注,千万要使用declaredFields而非getfields方法。否则无返回 Field[] fields=classType.getDeclaredFields(); //用来存读取到的内容 Object[] obj=new Object[2]; int i=0; for(Field field:fields){ //获取到相应字段的名称 //System.out.println(field.getName()); //field.get接的參数是要提取数据的实例,而非字段名称 //System.out.println("找到的值"+field.get(o)); obj[i]=field.get(o); i++; } //创建对象 Class<?> classType2=o.getClass(); Constructor<?> constructor=classType2.getConstructor(new Class[]{int.class,String.class}); //直接使用先前存放的obj数组就可以,以形成通用模式 //Object newobj=constructor.newInstance(new Object[]{}); Object newobj=constructor.newInstance(obj); //将新创建的对象返回出去 return newobj; } }



    
    




  • 相关阅读:
    JavaScript经典效果集锦之五(转)
    消息队列函数
    ipcs查看消息队列命令
    sizeof的解析
    【转】使用Reporting Services制做可折叠的报表
    【转】Hibernate动态条件查询(Criteria Query)
    【Wonder原创】NHibernate调用存储过程
    【转】C# const和readonly的区别
    【转】人际关系经验
    winform只存在一个进程处理
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6710156.html
Copyright © 2020-2023  润新知