JAVA学习(11) 反射

JAVA中所有类的祖先类都是object类,object类有一个很暴力的方法 getClass

例子,通过他得到子类的类名:getSimpleName

public class Test11A     {


     public void   check(Obj j) { 
         System.out.println(j.getClass().getSimpleName());

    }

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Test11A test11a = new Test11A();
        Obj obj = new Sub1(); 
        Obj obj2 = new Sub2(); 
        test11a.check(obj);
        test11a.check(obj2);  

    }

}
输出:
Sub1
Sub2

getName:

com.java.Obj.Sub1
com.java.Obj.Sub2

getDeclaredFields:获得成员变量数组

public class Sub1 extends Obj {

    private  int x;
    private  int y;
    public String string;
    public  void Test()
    {
        System.out.println("Sub1 Test");
    }

public class Test11A     {


     public void   check(Obj j) { 
         System.out.println(j.getClass().getClassLoader());

    }

     public void   check2(Obj j) { 
            // 取得本类的全部属性
         Class<?> mclass =null;
         mclass= j.getClass();
        Field[] fields= mclass.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            Field field = fields[i];
            Class<?>  curClass=field.getType(); 
            System.out.println(field.getModifiers()+","+curClass.getTypeName()+","+field.getName());

        }


    }

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Test11A test11a = new Test11A();
        Obj obj = new Sub1(); 
        Obj obj2 = new Sub2(); 
        test11a.check2(obj);
        test11a.check2(obj2);



    }




}
输出:
2,int,x
2,int,y
1,java.lang.String,string

访问修饰符是字符串,用java函数转换:

public void   check2(Obj j) { 
            // 取得本类的全部属性
         Class<?> mclass =null;
         mclass= j.getClass();
        Field[] fields= mclass.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            Field field = fields[i];
             Class<?>  curClass=field.getType();

            System.out.println(Modifier.toString((field.getModifiers()))+","+curClass.getTypeName()+","+field.getName());

        }


    }
输出:
private,int,x
private,int,y
public,java.lang.String,string
public void check2(Obj j) {
        // 取得本类的全部属性
        Class<?> mclass = null;
        mclass = j.getClass();
        Field[] fields = mclass.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            Field field = fields[i];
            Class<?> curClass = field.getType();

            System.out.println(
                    Modifier.toString((field.getModifiers())) + "," + curClass.getTypeName() + "," + field.getName());

        }

    }
public void check3(Obj j) {
    // 取得本类的全部方法
    Class<?> mclass = null;
    mclass = j.getClass();
    Method[] marray = mclass.getDeclaredMethods();
    for (int i = 0; i < marray.length; i++) {
        Method field = marray[i];

         java.lang.reflect.Parameter[] parameters= field.getParameters();
         for (int k = 0; k < parameters.length; k++) {
            java.lang.reflect.Parameter parameter = parameters[k];
            System.out.println(parameter.getType().getName());

        }
         System.out.println(","+Modifier.toString(field.getModifiers()) + " " + field.getReturnType().getTypeName() + ":"
                + field.getName());

    }

}
    public void check4(Obj j) {
        // 根据字符串调用对象方法
        Class<?> mclass = null;
        mclass = j.getClass();
        try {

            Method method = mclass.getDeclaredMethod("Test2",String.class,int.class);

            method.invoke(j,"hi",555);
        } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
                | InvocationTargetException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }

    }
 void  check5( ) throws InstantiationException, IllegalAccessException
    {
         //根据类名生成对象实例
         try {
            Class<?> mClass = Class.forName("com.java.Obj.Sub1");

                try{
                   Object obj =mClass.newInstance();
                    Method  fucMethod= mClass.getMethod("Test2", String.class,int.class);
                    fucMethod.invoke(obj, "hello ",123);

                }catch(Exception e){
                    e.printStackTrace();
                }
        } catch (ClassNotFoundException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值