反射

反射

import java.lang.reflect.*;
package reflect;
class Demo{

}

对象获得完整的包名和类名:demo.getClass().getName()
实例化class类对象:
Class demo1=Class.ForName("reflect.Demo"); Class demo2= new Demo().getClass();
Class<?> demo3=Demo.class;

通过无参构造实例化对象

Class<?> demo=Class.ForName("reflect.Demo");
Demo d=(Demo)demo.newInstance();
使用Class实例化其他类的对象的时候,一定要自己定义无参的构造函数,否则抛错

获得构造函数

Constructor<?> cons[]=demo.getConstructors();
Demo d1=(Demo)cons[0].newInstance();//默认无参构造
Demo d2=(Demo)cons[1].newInstance(“1234”);//有参数构造器

获得类实现接口

Class demo=Class.ForName("reflect.Demo"); Class intes[]=demo.getInterfaces();

获得父类

Class<?> temp=demo.getSuperclass();

获得类属性

Field[] field = demo.getDeclaredFields();
// 权限修饰符
int mo = field[i].getModifiers();
String priv = Modifier.toString(mo);
// 属性类型
Class<?> type = field[i].getType();

反射调用其他类中的方法

Class<?> demo = Class.forName("Reflect.Demo");
Method method=demo.getMethod("sayHello");
method.invoke(demo.newInstance());

method=demo.getMethod("sayHello", tring.class,int.class);//2个参数,string和int
method.invoke(demo.newInstance(),"Rollen",20);

调用其他类的set和get方法

obj=demo.newInstance();
Method method = obj.getClass().getMethod("getName");
String name=method.invoke(obj);

Method method = obj.getClass().getMethod("setName", String.class);
method.invoke(obj,value);

反射操作类属性

Class<?> demo = Class.forName("Reflect.Person");
Object obj = demo.newInstance();

Field field = demo.getDeclaredField("sex");
field.setAccessible(true);
field.set(obj, "男");

反射取得并修改数组信息

int[] temp={1,2,3,4,5};
Class<?>demo=temp.getClass().getComponentType();
System.out.println("数组类型: "+demo.getName());
System.out.println("数组长度 "+Array.getLength(temp));
System.out.println("数组的第一个元素: "+Array.get(temp, 0));
Array.set(temp, 0, 100);
System.out.println("修改之后数组第一个元素为: "+Array.get(temp, 0));

获得类加载器

test t=new test();
t.getClass().getClassLoader().getClass().getName();//
输出:sun.misc.Launcher$AppClassLoader
java中有三种类类加载器。
1)Bootstrap ClassLoader 此加载器采用c++编写,一般开发中很少见。
2)Extension ClassLoader 用来进行扩展类的加载,一般对应的是jre\lib\ext目录中的类
3)AppClassLoader 加载classpath指定的类,是最常用的加载器。同时也是java中默认的加载器。

反射,可以用于工厂模式,加强类的扩展能力。

定义fruit.properties文件
apple=Reflect.Apple
orange=Reflect.Orange
//获取properties文件
Properties pro=new Properties();
File f=new File("fruit.properties");
if(f.exists()){
  pro.load(new FileInputStream(f));}
//反射生成实例对象
Fruit f=(Fruit)Class.ForName(pro.getProperty("apple")).newInstance();

参考这里

posted @ 2016-06-28 10:23  toto怎么会喝醉  阅读(244)  评论(0编辑  收藏  举报