zoukankan      html  css  js  c++  java
  • 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语法糖 之 泛型
    虚拟机字节码执行引擎
    虚拟机的类加载机制
    性能监控之可视化故障处理工具 Visualvm
    性能监控之可视化故障处理工具 JConsole
    Node of C++ Linker.
  • 原文地址:https://www.cnblogs.com/dagangzi/p/4760814.html
Copyright © 2011-2022 走看看