黑马程序员----------反射

来源:互联网 发布:程序员眼镜 编辑:程序博客网 时间:2024/04/30 08:33

------- android培训、java培训、期待与您交流! ----------

反射

反射技术:动态的获取类以及类中的成员,并可以调用该类成员,获取指定类的名称,并建立该类的对象

反射技术的出现提高了程序的扩展性。

无论new 什么对象,都需要先获取字节码文件

如何获取字节码文件?

Java对字节码文件进行了描述用Class类完成

获取字节码文件Class的对象呢

方式一:object中的getClass();方法,但是在反射技术中不合适,因为反射技术中并不明确具体类

Person p=new Person();

Class clazz=p.get Class();

Syso(clazz);

方式二:所有的数据类型都有自己对应的Class对象,表示方法很简单,每一个数据类型都有一个默认的静态属性.class,用该属性就可以获取到字节码文件。

虽然不用对象调用,还是需要用具体的类调用静态属性。

Class clazz=Person.class;

Syso(clazz);

*方式三:在Class中有forName方法,通过名称就可以获取对应的字节码对象

String className=”类名(注意:要写入全部路径目录)”;

Classclazz=Class.forName(className);

Syso(clazz);

如何根据指定名称获取到指定的Class对象后建立该类的对象呢?

获取对象(空参)

//获取Class文件

String className=””;

Classclazz=Class.forName(className);

//创建对象

Object obj=clazz.newInstance();//创建了一个对象,默认调用该类的控参数构造函数,一般被反射的类通常都有空参数的构造函数

动态的创建对象根据指定的构造函数

先获取指定的构造函数,在通过该构造函数进行实例化

//获取Class文件

String className=””;

Classclazz=Class.forName(className);

//通过Class获取指定构造函数

Constructorcons=clazz.getConstructor(String .class, int.class);//传入类型对象

//通过指定的构造器对象进行对象的初始化

Object obj=cons.newInstance(“”,);//传入实参

Syso(obj);

动态的获取字段+暴力反射

//获取Class文件

String className=””;

Classclazz=Class.forName(className);

//获取指定字段

Field field=clazz.getField(“age”)//该方法只获取共有的

Fieldfield=clazz.getDeclaredField(“age”);//获取私有的

//对非静态的字段必须有对象

Object obj=clazz.getIntance();

//使用父类的方法将访问权限检查能力取消

Field.setAccessible(true);//暴力访问

field.set(obj,40);

syso(field.get(obj));

动态的获取指定方法

String className=””;

Classclazz=forName(className);

//反射非静态,无参数的方法

Method method=clazz.getMethod(“方法名”,null);

Objectobj=clazz.newInstance();

method.invoke(obj,null);

//反射静态,无参数的方法

Method method=clazz.getMathod(“方法名”,null);

method.invoke(null,null);

//反射非静态,有参数的方法

Method method=clazz.getMethod(“方法名”,String.class,int.class);//填方法名,类型对象

//创建对象

Objectobj=clazz.newInstance();

//传递实参

method.invoke(obj,”xiaoqiang”,20);

数组的反射:

具有相同维数和元素类型的数组属于同一个类型,即具有相同的class实例对象

基本数据类型的一维数组可被当做Object类型使用,不能当做Object[]类型使用,非基本数据类型的一维数组都可以

Class Test{
main(){

String className=args[0];

MethodmainMethod=Class.forName(classNmae).getMethod(“main”,String[].class);

mainMethod.invoke(null,newObject[]{new String[]{“111”,”222”}});

}

}

Class TestArgument{

Main(){

For(String arg:args){

Syso(arg)

}

}

}

集合框架的反射

public static void main(String[] args) throwsException{

        InputStream ips=new FileInputStream("config.properties");

        Properties prop=new Properties();

        prop.load(ips);

        ips.close();

        StringclassName=prop.getProperty("className");

        //Collectioncoll=(Collection)Class.forName(className).newInstance();

        Classclazz=Class.forName(className);

Collection coll=(Collection)clazz.newInstance();

        coll.add("a");

        coll.add("a");

        System.out.println(coll.size());

    }


0 0
原创粉丝点击