Java反射的应用
/**每天进步一点点
*/
//该包读取的是properties文件中的内容PersonType=com.anby.damain.Person
package com.anby.demo;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
public class Reflect {
public static void main(String[] args)throws Exception {
//设置数据集
Map<String,String> dataMap=new HashMap<String,String>();
dataMap.put("name", "Anby");
dataMap.put("age", "20");
dataMap.put("sex", "man");
dataMap.put("qq", "190241347");
dataMap.put("Email", "ailaohuyou123@yahoo.com");
Class clzz=Class.forName(getProperties("PersonType"));//若此处报异常,说明文件访问权限不够(java.lang.IllegalAccessException)
//獲取实例对象
Object obj=clzz.newInstance();
//获取所有对象中的字段
Field[] field=clzz.getDeclaredFields();
for (Field f : field)
{
f.setAccessible(true);
String fieldname=f.getName();
String value=dataMap.get(fieldname);
if(value!=null)
{
f.set(obj, value);
}
}
System.out.println(obj);
}
public static String getProperties(String key) {
//*获取properties下的字段
//1,指定资源文件名称
ResourceBundle rb=ResourceBundle.getBundle("Data");
//2,获取资源文件中相应字段的值
String type=rb.getString(key);
return type;
}
}
package com.anby;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//简单了解反射
public class ClssDemo {
public static void main(String[] args) throws Exception
{
Class cls=Class.forName("com.anby.Student");
Object obj=cls.newInstance();
Method[] m=cls.getDeclaredMethods();
for(int i=0;i<m.length;i++)
{
System.out.println(m[i].getName());//方法是打印不出來結果的,只能調用
}
Method m1=cls.getDeclaredMethod("print",null);
//Method m1=cls.getDeclaredMethod("print",String.class,int.class); m1.invoke();//调用该方法
}
public static void getConstructor() throws Exception
{
String stu="com.anby.Student";
//通过字节码获取类名称 并存放到内存
Class clss=Class.forName(stu);
//获取该类的默认构造函数
Constructor cons1=clss.getConstructor(null);
System.out.println(cons1);
//获取该类的的实例 \
//两种调用默认构造的方法
//1,通过构造函数Constructor对象获取
Object obj1=cons1.newInstance(null);
//2,通过Class对象获得
Object obj2=clss.newInstance();
//获得指定参数的构造函数(包括私有)
Constructor cons2=clss.getDeclaredConstructor(String.class,Integer.class);
//设置访问权限
cons2.setAccessible(true);
//使用私有构造函数进行初始化
Object obj3=cons2.newInstance("asd",123);
}
public static void getField() throws Exception
{
//同理,字段,方法,以及枚举都可以获取
// Field[] field= clss.getDeclaredFields();
// System.out.println(field);
Class c=Class.forName("com.anby.Student");
Object obj4=c.newInstance();
Field namef=c.getDeclaredField("name");
Field agef=c.getDeclaredField("age");
namef.setAccessible(true);// 访问私有字段时,若不加这句话,会抛出java.lang.IllegalAccessException
namef.set(obj4, "james");
Object namevalue= namef.get(obj4);
agef.get(obj4);
agef.set(obj4, 123);
Object agevalue=agef.get(obj4);
System.out.println(namevalue);
System.out.println(agevalue);
//设置age值
}
}
class Student
{
private String name="anby";
public int age=18;
public Student()
{
System.out.println("默认构造函数");
}
private Student(String name,Integer age)
{
System.out.println("带参数的构造函数");
}
public void print()
{
System.out.println("print");
}
}
|