Java 反射

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());// 當(dāng)且僅當(dāng)基礎(chǔ)類是局部類
        System.out.println("isMemberClass:" + InnerClass.class.isMemberClass());// 成員內(nèi)部類
        System.out.println("isPrimitive:" + cls.isPrimitive());// 基本數(shù)據(jù)類型,非他們的包裝類
        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轉(zhuǎn)換為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 {

    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容