反射
反射机制:将类的各个组成部分封装为其他对象。
Java的类经过javac编译,生成class文件,在class文件中,一个类分为成员变量、构造方法、成员方法三类,再经过类加载器加载进内存,到内存中为class类对象,class类对象中成员变量为Field Field[]、构造方法为Constructor[]]、成员方法为Method
反射API
类的class文件获取
-
Class c=Class.forname("完整包名");
如:Class c1=Class.forName("com.flect.test.User");
-
类名.class:通过类名的属性class获取
-
对象.getclass():通过getclass()方法获取,getclass方法在object类中已定义
Java中任何一种类型,包括基本数据类型都有.class属性。string.class;int.class;Date.class;
对于基本数据类型和包装数据类型,如int和Integer两个的class不同
Class c1=int.class;
Class c2=Integer.class;
System.out.println(c1==c2);
结果 ==>false
同一个字节码文件.class在一次程序运行过程中,只会被加载一次,获取到的class对象都是同一个
class对象可以获取成员变量[]、构造方法[]、成员方法[]、获取类名
获取class类文件的变量、方法
Class c=string.class;
-
获取成员变量
1.Field[] files=c.getFields();//获取所有public成员变量 2.Field[] files=c.getDeclareFields();//获取所有属性 3.Field getDeclaredField(String name);//根据变量名获取属性 对于获取的私有的会有安全问题,要先忽略安全问题Field.setAccessible(true);
//string a; Field a=c.getField("a");//获取class文件c的a的成员变量对象 //实例化对象person p=new Person(); Object value=a.get(p);//通过成员变量a对象调用get方法知道传入的对象的对应a变量的值 //设置对象的a变量的值 a.set(p."lisi");
-
构造方法
//获取class文件的形参是string,int的构造方法的class对象 Constructor c=Class.getConstructor(String.class,int.class); //创建对象 Object obj=c.newInstance("lisi",13); //空参的构造方法直接使用class对象的newInstance Object o=Class.newInstance();
-
获取成员方法
class Person{ public void func(){} public void func(String s){} } 1.获取指定名称的方法(无参) Method fun=Class.getMethod("func"); Person p=new Person();//对象 //执行方法 fun.invoke(p); 2.获取有参的 Method fun=Class.getMethod("func",String.class); Person p=new Person();//对象 //执行方法 fun.invoke(p,"lisi"); ------------------------------------------- 获取所有public方法Method[] ms=Class.getMethods();
-
获取类名
String className=Class.getName();
配置文件与反射结合
将要使用的类的全类名写在配置文件上,加载读取配置文件信息,使用反射创建对象
在src下创建配置文件classinfo.properties
username=com.flect.test.User
--------------------------------------
public static void main(String[] args) throws Exception
{
FileReader f= new FileReader("反射/classinfo.properties");//打开文件;
Properties p=new Properties();
p.load(f);//加载try文件;
f.close();
String user=p.getProperty("username");
Class c2=Class.forName(user);
Object obj=c2.newInstance();//==>2222222222
System.out.println(obj);//==》ssssss
}
----------------------------------------
user类
package com.flect.test;
public class User
{
User(){
System.out.println("2222222222");
}
public String toString(){
return "ssssss";
}
}