package test.my;
import java.lang.reflect.*;
class Point{
public int x = 1;
public int y = 2;
private int z = 0;
public Point(){}
public Point(int x,int y){
this.x = x;
this.y = y;
}
public int add(int x ,int y){
return x + y + this.x * 2 + this.y*3;
}
@Override
public String toString(){
return "x = " + x + " y = " + y;
}
}
public class ClassReflectTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
/**得到Class实例的三种方法
* 1.类名.class eg:String.class
* 2.类的对象 .getClass()方法 eg: String s ; class<String> clazz = s.getClass()
* 3.Class.forName("类的全称"); eg: Class.forName("java.lang.String");
* 判断是否是数组用的是isArray()方法
*/
Class<String> clazzString = (Class<String>) Class.forName("java.lang.String");
System.out.println(clazzString.newInstance().getClass());
System.out.println(Point.class.newInstance());//x = 1 y = 2
Class<Point> clazzPoint = Point.class;
//通过反射的得到构造函数 然后构造一个对象
Constructor conPo = clazzPoint.getConstructor(int.class,int.class);
Point p1 = (Point) conPo.newInstance(3,4);
System.out.println(p1);//x = 3 y =4
Point p2 = new Point(5,6);
//得到属性 getFields() 只得到公开的属性 getDeclaredFields()得到所有的声明的属性
//Field[] fieldPoint = clazzPoint.getFields();
Field[] fieldPoint = clazzPoint.getDeclaredFields();
for(Field field : fieldPoint){
System.out.println(field);
}
//得到某个特定属性的值
Field f = clazzPoint.getField("x");
//想要得到那个对象属性的值就用 f.get(某个对象的引用)
System.out.println(f.get(p1) + " " + f.get(p2));
//得到方法 注意需要时public访问权限是才可以找到
Method[] methodPoint = clazzPoint.getMethods();
for(Method method : methodPoint){
System.out.println(method);
}
Method m = clazzPoint.getDeclaredMethod("add", int.class,int.class);
System.out.println(m.invoke(p1,5,5));//28
//得到构造方法
Constructor[] conPoint = clazzPoint.getConstructors();
for(Constructor con : conPoint){
System.out.println(con);
}
}
}
反射实验
最新推荐文章于 2024-03-20 16:38:51 发布