反射初级阶段:
一.总共三个特点:getConstructors()获取构造函数
getMethods()获取普通自己写的方法
getField(“id”)获取属性
二.获取字节码对象(即class)三种方法
方式一:Class clazz = Class.forName("flect.Person");
方式二:Class clazz =Person.class;
方式三:new Person(1,"1212").getClass();
三:三个特点的详细方法
一.获取构造函数的详细方法
1.getConstructors() 获取所有的公有方法
2.getDeclaredConstructors() 获取所有的方法,包括 私有和公有
3.Constructor c=getDeclaredConstructor(属性类型.class,属性类型.class)获取私有的单一方法
4.创建对象 c.newInstance(110,"123");如果构造方法c为私有,必须加上权限c.setAccessible(true);
二.获取普通函数的详细方法
1.getMethods() 返回一个包含某些 Method 对象的数组
2.getMethod("方法名", 类型.class,类型.class);返回该方法的Method对象,只能用于公有方法
3.getDeclaredMethod("方法名", 类型.class); 可返回私有方法的Method对象
4.method.invoke(“对象名”, “method方法的传递参数值”); 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 如果该方法是私有的,必须加入调用权限method.setAccessible(true);
三.获取属性的详细方法
1.getFields();返回一个包含某些 Field 对象的数组,仅仅只包含公有属性
2.class.getField(“属性名”);返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
3.class.getDeclaredFields(“属性名”); 返回一个 Field 对象.可包含私有属性
4.field.set(“对象p”,”值”);为对象p的field属性设置一个值
四:详细案例
1.获取构造函数
//方式一
Class clazz=Class.forName("flect.Person");
System.out.println(clazz);
//方式二
Class clazz2=Person.class;
System.out.println("clazz2:"+clazz2);
//方式三
Class clazz=new Person(11,"1212").getClass();
//得到公有
//Constructor constrs[]=clazz.getConstructors();
Constructor constrs[]=clazz.getDeclaredConstructors();
//Constructor c=clazz.getDeclaredConstructor(int.class,String.class);
//如果是私有。就必须加上权限
/*c.setAccessible(true);
Person p=(Person) c.newInstance(110,"123");
System.out.println(p.id+":"+p.name);*/
for(Constructor c:constrs)
{
System.out.println(c);
}
2.获取普通函数方法
Class clazz=Person.class;
Method methods[]=clazz.getMethods();
for(Method m:methods)
{
System.out.println(m);
}
Person p=new Person(123,"33");
Method method=clazz.getMethod("eat", int.class,int.class);
method.invoke(p, 3,5);
Method method2=clazz.getDeclaredMethod("sleep", int.class);
method2.setAccessible(true);
method2.invoke(p, 5);
3.获取属性方法
Person p=FactoryNewInstances.createPerson();
Field field[]=p.getClass().getFields();
for(Field f:field)
{
System.out.println(f);
}
Field fid=p.getClass().getField("id");
fid.set(p, 3);
Field fname=p.getClass().getField("name");
fname.set(p, "小布");
五:其它补充知识
1.创建一个object.properties文件,用于访问外部文件,做一个工厂类型。其中大致内容为:obj_url=flect.Person,id=007,name=tiger
访问方式为://通过读取配置文件,利用反射来创建一个对象
Properties pro = new Properties();
try { pro.load(FactoryNewInstances.class.getResourceAsStream("/object.properties"));
String objUrl = pro.getProperty("obj_url");
id = pro.getProperty("id");
name = pro.getProperty("name");
} catch (Exception e) {
e.printStackTrace();