zoukankan      html  css  js  c++  java
  • java反射机制(2)

        这个相当于是对第一部分的补充说明,主要是想演示一下利用反射机制对一个对象进行拷贝,从而体现出对于Field类和Array类的使用情况。

    package com.javase.reflectionfuther;
    
    public class original {
    
        int age;
        String name;
        int grade;
        
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getGrade() {
            return grade;
        }
        public void setGrade(int grade) {
            this.grade = grade;
        }
    }
    package com.javase.reflectionfuther;
    
    import java.lang.reflect.*;
    
    public class testCopy {
        //利用反射实现copy一个类
        public static Object copy(Object object) throws Exception{
            
            Class<?>classType=object.getClass();
            //如果没有构造函数的时候会比较麻烦  相当于在copy函数中要把所有的函数都模拟出来
            //在之前的例子中 要是有构造函数的时候 
            //直接通过返回constructor,之后通过constructor.newInstance传入新的参数就可以出来新的实例
            Object objCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
            
            //获取field属性    
            Field[] fields=classType.getDeclaredFields();
            for (Field field:fields)
            {
               String name=field.getName();
               //System.out.println(name);
               String firstletter=name.substring(0,1).toUpperCase();
               //生成这个属性对应的get和set方法
               String getMethodname="get"+firstletter+name.substring(1,name.length());
               String setMethodname="set"+firstletter+name.substring(1,name.length());
               //获取方法
               Method getMethod=classType.getMethod(getMethodname, new Class[]{});
               //注意这里getName与getType的区别
               //对于属性int age 
               //则getName返回的是age getType返回的是int
               Method setMethod=classType.getMethod(setMethodname, new Class[]{field.getType()});
               
               //通过反射调用object类的方法 
               Object value=getMethod.invoke(object,new Object[]{});
               //通过反射调用objCopy实例的 set方法 把值传入进去
               setMethod.invoke(objCopy, new Object[]{value});
    
            }
            
            
            return objCopy;
        }
        
        public static void main(String[]args) throws Exception
        {
            //对于copy函数的测试
            original org=new original();
            org.setAge(25);
            org.setGrade(98);
            org.setName("wz");
            original copyorg=(original)copy(org);
            System.out.println(copyorg.getAge()+";"+copyorg.getGrade()+";"+copyorg.getName());
            
            
            //对于Array类的简单测试 Array类中好多都是静态的方法
            Class<?>classType=Class.forName("java.lang.String");
            //返回一个array数组 每个元素的类型是classType长度是10
            Object array=Array.newInstance(classType, 10);
            Array.set(array,5,"hello");
            //返回array对象的第5个位置的元素 
            String str=(String)Array.get(array, 5);
            System.out.println(str);
            
            //定义array的三个维度为5 10 15
            int[] dims=new int[]{5,10,15};
            //第一个参数是数组中每个元素类型 第二个是维度信息 三维数组的长宽高是 5 10 15
            Object triplearray=Array.newInstance(Integer.TYPE, dims);
            Object arrayobj=Array.get(triplearray,3);
            arrayobj=Array.get(arrayobj,5);
            Array.set(arrayobj, 10, 37);
            int [][][]arrayCast=(int [][][])triplearray;
            System.out.println(arrayCast[3][5][10]);
            
        }
    
    }

    输出结果:

    25;98;wz
    hello
    37

        感觉对着代码说比较容易,第一部分定义了一个original类,我们就是要对这个类进行拷贝。通过第一部分的内容我们可以知道,其实完全可以通过反射机制返回一个constructor对象,再通过constructor的newinstance方法生成一个新的对象,针对拷贝一个对象而言,定义构造函数显然拷贝起来更容易一些,要不然我们就得使用上面代码中的方法,通过返回Field,来逐一的生成每个属性的set和get方法,逐一地进行赋值,这样就比较麻烦了,但是是最基本最朴素的方法。

        再往后的代码主要是演示了一下Array类的使用,比如get方法,以及newInstance方法,以及Object对象与int[][][]之间的转化。

  • 相关阅读:
    [转]sql getdate() 时间格式设置
    [Prism练习] Prism下MVVM中命令绑定的CanExecute问题
    [Prism练习] Prism Modularity 配合 Unity Ioc 用 XML 方式
    Java课程设计
    WinForm指定ListView某项的字体和前景色。
    [Python学习第一天]内置数据类型介绍,万物皆对象!
    设置Swing使用系统风格的组件
    Tomcat Valve:AccessLogValve
    【转】HttpClient关闭连接
    学习Tomcat的相关资料
  • 原文地址:https://www.cnblogs.com/Goden/p/3797763.html
Copyright © 2011-2022 走看看