反射
反射
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();
I am a slow walker, but I never walk backwards.