反射

反射获取一个类

准备好类获取Class.forName

通过getDeclar那个方法获取到Constructor 对象

设置Constructor 的可访问setAssiable

访问Constructor 的newInstance方法

package com.syh.reflect.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import com.sun.org.apache.xml.internal.security.Init;

public class CreatObject {

public static Object creatObject(){
Object obj=null;
try {

//准备好类
String className="com.syh.reflect.test.CreatObject";

//通过Class.forName获取到类
Class claz=Class.forName(className);
Class []paramClaz={Init.class,String.class,String.class,String.class};

 

//通过getDeclaredConstructor获取到Constructor 对象
Constructor cc=claz.getDeclaredConstructor(paramClaz);


//设置Constructor 对象可访问
cc.setAccessible(true);


//参数设置后 Constructor 对象的newInstance方法
Object []paramObjs={10,"电脑","北京海淀区","男"};
obj=cc.newInstance(paramObjs);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return null;

}
}

 

 

通过Class上面的实例方法

public Field[] getFields()
返回一个包含某些Field对象的数组,这些对象反映此Class对象所表示的类或接口的所有可访问公共字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果类或接口没有可访问的公共字段,或者表示一个数组类、一个基本类型或 void,则此方法返回长度为 0 的数组

getDeclaredFields()
 返回Field

 


getDeclaredField(String name)
返回一个Field对象,该对象反映此Class对象所表示的类或接口的指定已声明字段。

getField(String name)
 返回一个Field对象,它反映此Class对象所表示的类或接口的指定公共成员字段。

 

package com.syh.reflect.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

import com.sun.org.apache.xml.internal.security.Init;

public class ReflectTest {

public static void main(String[] args) {
changeFiled();
}

public static void changeFiled(){

try {
Object obj=creatObject();
Class claz=obj.getClass();

Field ageField=claz.getDeclaredField("age");
Field nameField=claz.getDeclaredField("name");
Field addressField=claz.getDeclaredField("address");
Field sexField=claz.getDeclaredField("sex");

ageField.setAccessible(true);
nameField.setAccessible(true);
addressField.setAccessible(true);
sexField.setAccessible(true);

ageField.setInt(obj, 200);
nameField.set(obj,"computer");
addressField.set(obj,"中国");
sexField.set(obj,"女");

int age=ageField.getInt(obj);
String name=(String) nameField.get(obj);
String address=(String) addressField.get(obj);
String sex=(String) sexField.get(obj);
System.out.println(age+","+name+","+address+","+sex);

} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Object creatObject(){
Object obj=null;
try {
String className="com.syh.reflect.test.CreatObject";
Class claz=Class.forName(className);

Class []paramClaz={Init.class,String.class,String.class,String.class};
Constructor cc=claz.getDeclaredConstructor(paramClaz);

cc.setAccessible(true);

Object []paramObjs={10,"电脑","北京海淀区","男"};
obj=cc.newInstance(paramObjs);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return null;

}
}

posted @ 2020-01-07 07:09  动起来mygod  阅读(143)  评论(0)    收藏  举报