Java Reflect 反射

来源:互联网 发布:qq飞车f22猛禽性能数据 编辑:程序博客网 时间:2024/06/07 18:01

Class类的使用

1.在面向对象的世界里,万事万物皆对象
java中,有2个不是面向对象的,一是普通数据类型(由包装类弥补),二是静态的东西(静态属于类,不属于对象)

类是对象,类是java.lang.Class类的实例对象
There is a class named Class
2.这个对象如何表示?

package com.test.reflect;public class Foo{    void print(){    }}public class Demo{    public static void main(String[] args){        //Foo的实例对象如何表示:        Foo foo1=new Foo();        //Foo这个捏也是一个实例对象,Class类的实例对象,如何表示呢        //任何一个类都是Class的实例对象,这个实例对象有3种表示方式        //第一种表示方式:        //实际告诉我们任何一个类都有一个隐含的静态成员变量class        Class c1=Foo.class;        //第二种表示方式:已经知道该类的对象通过getClass方法        Class c2=foo1.getClass();        /*c1,c2表示了Foo类的类类型(class type)        *万事万物皆对象,        *类也是对象,是Class类的实例对象        *这个对象我们称为该类的类类型*/        //c1,c2都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象        Sytstem.out.println(c1==c2);//true        //第三种表达方式        Class c3=null;        try{            c3=Class.forName("com.test.reflect.Foo");        }catch(ClassNotFoundException e){            e.printStackTrace();        }        Sytstem.out.println(c3==c2);//true        //我们完全可以通过类的类类型创建该类的对象实例        //通过c1 or c2 or c3创建Foo的实例        try{            Foo foo=(Foo)c1.newInstance();            foo.print();        }catch (InstantiationException e){            e.printStackTrace();        }catch (IllegalAccessException e){            e.printStackTrace();        }    }}

java动态加载类

编译时刻加载类———静态加载类
运行时刻加载类———动态加载类

//用new 创建对象,是静态加载类,在编译时刻就需要加载所有可能使用到的类

//动态加载类,在运行时刻加载Class  c=Class.forName(args[0])//编译时是不会报错的//通过类类型,创建该类对象OfficeAble oa=(OfficeAble)c.newInstances();oa.start();

通过OfficeAble制定标准,以后根据需要动态加载类Word,Exlel;
功能性的类尽量使用动态加载,而不是静态加载

interface OfficeAble{    public void start();}
class Word implements OfficeAble{    public void start(){        //...    }}
class Excel implements OfficeAble{    public void start(){        //...    }}

获取方法信息

待编辑

成员变量的反射

构造函数的反射

Java类加载机制

原创粉丝点击