美文网首页
Java 反射

Java 反射

作者: 一颗北上广的心 | 来源:发表于2017-11-09 17:10 被阅读0次
    package com.city.yf.reflector;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    import java.lang.reflect.Type;
    import java.util.Arrays;
    
    public class Test {
    
        /**
         * @param args
         * @throws Exception
         */
        public static void main(String[] args) throws Exception {
    
            class PartClass {
    
            }
    
            Class<?> cls = Class.forName("com.city.yf.reflector.User");
            System.out.println("name:" + cls.getName());
            System.out.println("canonicalName:" + cls.getCanonicalName());
            System.out.println("modifier:" + cls.getModifiers());
            System.out.println("modifier:" + Modifier.toString(cls.getModifiers()));
            System.out.println("simpleName:" + cls.getSimpleName());
            System.out.println("typeName:" + cls.getTypeName());
            System.out.println("annotation:" + cls.isAnnotation());// 注解
            System.out.println("annotationOf:" + cls.isAnnotationPresent(SuppressWarnings.class));
            System.out.println("anonymous:" + cls.isAnonymousClass());
            System.out.println("isArray:" + cls.isArray());
            System.out.println("isArray:" + new User[] {}.getClass().isArray());
            System.out.println("assignableFrom:" + People.class.isAssignableFrom(User.class));
            System.out.println("isEnum:" + cls.isEnum());
            System.out.println("isInstance:" + cls.isInstance(new User()));
            System.out.println("isInterface:" + cls.isInterface());
            System.out.println("isLocalClass:" + PartClass.class.isLocalClass());// 当且仅当基础类是局部类
            System.out.println("isMemberClass:" + InnerClass.class.isMemberClass());// 成员内部类
            System.out.println("isPrimitive:" + cls.isPrimitive());// 基本数据类型,非他们的包装类
            System.out.println("isPrimitive:" + Integer.TYPE.isPrimitive() + Integer.class.isPrimitive());// Integer.Type==int.class
            System.out.println("isSynthetic:" + cls.isSynthetic());// Proxies. TODO
            System.out.println("asSubClass:" + cls.asSubclass(People.class));// cls转换为people的子类
            System.out.println("case:" + ((User) cls.cast(new User())).age);
            System.out.println("getAnnotatedInterfaces:");
            Arrays.asList(cls.getAnnotatedInterfaces()).stream().forEach(System.out::println);
            System.out.println("getAnnotatedSuperclass:" + cls.getAnnotatedSuperclass());
            System.out.println("componentType:" + new String[] {}.getClass().getComponentType());
    
            System.out.println("getConstructors:" + cls.getConstructors().length);
            Constructor<?>[] constructors = cls.getConstructors();
            for (Constructor<?> constructor : constructors) {
                if (constructor.getParameterCount() > 0) {
                    User user = (User) constructor.newInstance("F");
                    System.out.println(user.age + "\t" + user.name);
                } else {
                    User user = (User) constructor.newInstance();
                    System.out.println(user.age + "\t" + user.name);
                }
            }
            System.out.println(((User) cls.getConstructor(String.class).newInstance("hahaha")).name);
    
            Field[] fields = cls.getDeclaredFields();// 返回全部字段,不包含继承的
            for (Field field : fields) {
                String name = field.getName();
                String modifier = Modifier.toString(field.getModifiers());
                Class<?> fieldCls = field.getType();
                System.out.println(String.format("%s %s %s", modifier, fieldCls.toString(), name));
            }
            fields = cls.getFields();// 返回 public 字段
            for (Field field : fields) {
                String name = field.getName();
                String modifier = Modifier.toString(field.getModifiers());
                Class<?> fieldCls = field.getType();
                System.out.println(String.format("%s %s %s", modifier, fieldCls.toString(), name));
            }
            User user = new User();
            user.age = 10;
            user.name = "hyx";
            Field idField = cls.getDeclaredField("id");
            idField.setAccessible(true);
            System.out.println(idField.get(user));
    
            Method[] methods = cls.getDeclaredMethods();
            for (Method method : methods) {
                String name = method.getName();
                Type[] paramTypes = method.getGenericParameterTypes();
                Type returnType = method.getGenericReturnType();
                String modifier = Modifier.toString(method.getModifiers());
                System.out.print(modifier + " " + returnType.toString() + " " + name + "( ");
                Arrays.asList(paramTypes).stream().forEach(i -> System.out.print(i + ","));
                System.out.println(")");
            }
            Method method = cls.getMethod("test4", null);//only public
            String result = (String) method.invoke(new User());
            System.out.println("result of invoking test4:" + result);
            
            method = cls.getDeclaredMethod("test2", null);//all methods
            method.setAccessible(true);
            method.invoke(new User());
        }
    
        class InnerClass {
    
        }
    
        interface ITest {
    
        }
    }
    
    

    相关文章

      网友评论

          本文标题:Java 反射

          本文链接:https://www.haomeiwen.com/subject/exrmmxtx.html