• java反射温习一下


    public class LoveReflect {
        public static class Demo  implements Serializable{
            
        }
        
        public static void main(String[] arg) {
            Demo demo = new Demo();
            System.out.println(demo.getClass().getName());
        }
    }

    输出

    LoveReflect$Demo
    ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
    JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [../../../src/share/back/util.c:820]

    import java.io.Serializable;
    import java.lang.reflect.Array;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    import java.util.HashMap;
    import java.util.Map;
    
    public class LoveReflect {
        public static class SubClass implements Serializable {
            private int id;
            private String name;
    
            public SubClass() {
            }
    
            public SubClass(Integer id, String name) {
                this.id = id;
                this.name = name;
            }
    
            public int getId() {
                return id;
            }
    
            public void setId(int id) {
                this.id = id;
            }
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
            
            public void subMethod() {
                System.out.println("hello world");
            }
        }
    
        public static void main(String[] arg) {
            SubClass subClass = new SubClass();
    
            //【案例1】通过名字取得类的声明,再取得名字
            System.out.println(subClass.getClass().getName());
            
            Class<?> demo1;
            try {
                //【案例2】通过名字取得类的声明
                demo1 = Class.forName("LoveReflect$SubClass");
                System.out.println(demo1.getName());
    
                //【案例3】通过名字找到类的声明,再创建实例
                SubClass subClass2 = (SubClass) Class.forName("LoveReflect$SubClass").newInstance();
                subClass2.setId(1);
                subClass2.setName("aaaa");
                System.out.println(subClass2.getName());
    
                //【案例4】拿类的的构造函数new实例
                Class<?>[] parameterTypes = {Integer.class,String.class};
                Constructor constructor = Class.forName("LoveReflect$SubClass").getDeclaredConstructor(parameterTypes);
                SubClass subClass3 = (SubClass)constructor.newInstance(2,"222222222222222222");
                System.out.println(subClass3.getName());
                
    //            改个属性值
                Field f = subClass3.getClass().getDeclaredField("name");
                Class<?> type = f.getType();
                System.out.println("field type="+type.getName());
                int mod = f.getModifiers();
                System.out.println("modify="+Modifier.toString(mod));
                
                f.setAccessible(true);
                f.set(subClass3, "bbbbbbbbbbbbbbb");
                System.out.println(subClass3.getName());
                
                Map<Integer,Method> methods = new HashMap<Integer,Method>();
                Class<?>[] parameterTypes2 = {};
                Method method = Class.forName("LoveReflect$SubClass").getDeclaredMethod("subMethod", parameterTypes2);
                
                //用实例调方法
                method.invoke(subClass3, null);
                
                //通过反射处理数组
                SubClass[] subClass_ = {new SubClass(1,"bbbbbbbbbbbbbbb"), subClass, subClass2, subClass3};
                Class<?> arrayType = subClass_.getClass().getComponentType();
                System.out.println("array type="+arrayType.getName());
                System.out.println("array leangth="+Array.getLength(subClass_));
                System.out.println("first one="+((SubClass)Array.get(subClass_, 0)).getName());
                Array.set(subClass_, 0, subClass2);
                System.out.println("first one="+((SubClass)Array.get(subClass_, 0)).getName());
                
                //修改数组的大小
                SubClass[] newTemp=(SubClass[])arrayInc(subClass_,15);
                System.out.println("array leangth="+Array.getLength(newTemp));
                print(newTemp);
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
        
        
           /**
         * 修改数组大小
         * */
        public static Object arrayInc(Object obj,int len){
            Class<?>arr=obj.getClass().getComponentType();
            Object newArr=Array.newInstance(arr, len);
            int co=Array.getLength(obj);
            System.arraycopy(obj, 0, newArr, 0, co);
            return newArr;
        }
        /**
         * 打印
         * */
        public static void print(Object obj){
            Class<?>c=obj.getClass();
            if(!c.isArray()){
                return;
            }
            System.out.println("数组长度为: "+Array.getLength(obj));
            for (int i = 0; i < Array.getLength(obj); i++) {
                System.out.print(Array.get(obj, i)+" ");
            }
        }
    }
  • 相关阅读:
    异常处理——Java的try catch用法
    C# 如何通过mailto标签和SMTP协议两种方式发送邮件
    Sublime Text 插件之HTML-CSS-JS Prettify—格式化HTML CSS JS与显示函数列表
    C# 如何提取字符串中的数字
    C# 解决读取dbf文件,提示Microsoft Jet 数据库引擎找不到对象的问题
    解决UEFI启动模式下无法使用U盘启动WIN7安装界面
    实现Windows直接远程访问Ubuntu 18.04(旧版本也支持,无需安装第三方桌面,直接使用自带远程工具)
    深度学习(TensorFlow)环境搭建:(三)Ubuntu16.04+CUDA8.0+cuDNN7+Anaconda4.4+Python3.6+TensorFlow1.3
    深度学习(TensorFlow)环境搭建:(二)Ubuntu16.04+1080Ti显卡驱动
    xrdp完美实现Windows远程访问Ubuntu 16.04
  • 原文地址:https://www.cnblogs.com/dagangzi/p/4760814.html
Copyright © 2020-2023  润新知