java学习笔记#10-反射机制

2018-09-23  本文已影响0人  edwin1993

CLASS类的使用

在面向对象的中,几乎所有的内容都是对象,除了静态成员和基本类型外。
类是java.lang.Class类的对象。
对象是对客观事物的抽象,类是对对象的抽象。它们的关系是,对象是类的实例,类是对象的模板。

任何一个类,都是Class类的实例对象。在java底层,Class类的构造方法是私有的

动态加载类的方法如下:

Class c = Class.forName("Framework.Reflact");
OtherClass otherclass =  c.newInstance()

这种方法通过类类型来创建对象。

Class还有很多其它的用途
public class ClassUtil {
    public static void printClassInfos(Object object){
        Class cls = object.getClass();
        System.out.println("Class name is :"+ cls.getName());
//        一个成员方法就是方法类的对象
        Method[] methods = cls.getMethods();//获取所有public方法,包括父类继承而来的。
        Method[] declaredMethods = cls.getDeclaredMethods();//获取自己声明的方法
        for (Method method : methods) {
            System.out.println(method.getName());
        }
        System.out.println("======================>");
//       成员变量也是对象
        Field[] fields = cls.getFields();//获取所有public成员变量信息。
        for (Field field:fields){
            System.out.println(field.getType());
            System.out.println(field.getName());
        }
        System.out.println("======================>");
//        构造函数也是对象
        Constructor[] constructors = cls.getConstructors();
        for(Constructor constructor: constructors){
            System.out.println(Arrays.toString(constructor.getParameterTypes()));
        }

    }
}

方法的反射

反射过程:
获取某个方法
method.invoke(对象,参数)

public class ReflectDemo {
    public static void main(String args[]){
//        获取类的信息
        A a1 = new A();
        Class cls = a1.getClass();
//        获取类的方法
        try {
//            Method method = cls.getMethod("print",new Class[]{int.class,int.class});
            Method method = cls.getMethod("print",int.class,int.class);

//            方法的反射操作:用method对象来调用方法。
//            原本操作为a1.print(10,20)
            method.invoke(a1,10,20);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class A{
    public void print(int a, int b){
        System.out.println(a + b);
    }

    public void print(String a, String b){
        System.out.println(a.toUpperCase() + " "+ b.toLowerCase());
    }
}

可以通过反射来绕过泛型约束:

        ArrayList list1 = new ArrayList();
        ArrayList<String> list2 = new ArrayList<String>();

        list2.add("abc");
//        list2.add(20);错误的

        Class c1 = list1.getClass();
        Class c2 = list2.getClass();

        System.out.println(c1 == c2);
//        True,说明编译后的集合是去泛型的。

        try {
            Method m = c2.getMethod("add",Object.class);
            m.invoke(list2,100);
            System.out.println(list2);//[abc,100]
        } catch (Exception e) {
            e.printStackTrace();
        }
上一篇 下一篇

猜你喜欢

热点阅读