java反射入门速成:
知晓对象里面的值:
public <T> void Test(T t) throws IllegalAccessException{
Class<T> cls=(Class<T>) t.getClass();
Field[] fields=cls.getDeclaredFields(); //只获取声明过的属性
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true); //暴力获取私有属性
Object value=fields[i].get(t);
System.out.println(fields[i].getName()); // 属性名
System.out.println(fields[i].getType()); //属性的基本数据类型
System.out.println(value); //属性值
//获取访问修饰符
int mod = fields[i].getModifiers();
String modify = Modifier.toString(mod);
//通过属性名将值注入到对象里面(注意传入数据类型要与声明数据类型一致)
if(fields[i].getType().equals("你声明的属性名称")){
fields[i].set(t,1);
}
}
}
例子:
Bean bean=new Bean();
new Test().Test(bean);
动态调用对象
/**
*
* @param clazz 类路径
* @param methodName 类所属的方法名
* @param args 所属方法对应的参数数组 Object [] args1={args,args};
* @throws ClassNotFoundException
*/
public void invokeMethod(String clazz,String methodName,Object[] args) throws ClassNotFoundException,InstantiationException,IllegalAccessException, InvocationTargetException {
Class<?> cls=Class.forName(clazz);
Method[] methods=cls.getDeclaredMethods();
for (int i = 0; i < methods.length ; i++) {
Method method=methods[i];
//方法修饰符是私有的需要配置这个
method.setAccessible(true);
if(method.getName().equals(methodName)){
//调用指定的方法
Object value=method.invoke(cls.newInstance(),args);
//value 为方法执行后的结果,具体结果看你声明的返回值类型
// 如果返回数据类型是void 则value为null
System.out.println(value);
}
}
}
例子:
public class TestMain {
private void TestOne(String s1,String s2){
System.out.println(s1+":"+s2);
}
}
Object [] value={"hello","world"};
new Test().invokeMethod("com.sxt.Test.TestMain","TestOne",vaue);
通过类路径任意创建对象(无参):
public <T> T TestTwo(String clazz) throws ClassNotFoundException, IllegalAccessException,InstantiationException{
Class<?> cls=Class.forName(clazz);
return (T)cls.newInstance();
}
通过类路径任意创建对象(有参):
public <T> T TestTwo(String clazz,Class[] args2,Object[] args) throws ClassNotFoundException, IllegalAccessException,InstantiationException
,InvocationTargetException,NoSuchMethodException{
Class<?> cls=Class.forName(clazz);
Constructor c2=cls.getConstructor(args2);
return (T)c2.newInstance(args);
}
例子:
public class TestBean {
private Integer id;
private String name;
//省略set和get方法
public TestBean(Integer id, String name) {
this.id = id;
this.name = name;
}
public TestBean() {
}
}
Object[] arg={1,"小明"};
Class[] arg2={Integer.class,String.class};
TestBean t=new Test().TestTwo("com.sxt.Test.TestBean",arg2,arg);
System.out.println(t);