反射,类,构造方法,方法,属性
//要进行反射的类
public class Penson {
public int age=0;
public String name="zhangsan";
private String job="";
public Penson(int age, String nameString) {
this.age = age;
this.name = nameString;
}
public Penson() {
}
private Penson(int age) {
System.out.println("我是一个私有构造方法");
}
public void say() {
System.out.println("您好 !我是一个公共方法");
}
private void says() {
System.out.println("您好,我是个私有方法");
}
public void say(String name,int age) {
System.out.println("您好 !我是:"+name+",年龄:"+age);
}
public static void sayStatic() {
System.out.println("我是一个静态 方法");
}
public int sayReturn() {
return 1;
}
}
//反射
import java.lang.reflect.*;
public class Test {
public static void main(String[] args) {
//setAndGetField();
//getMethod();
getConstructor();
getType(new Penson());
}
/**
* 反射类,实例化
*/
public static void getType(Object o) {
try {
Class clazz= Class.forName("Penson");
//第一种方式:直接创建实例
//Penson p=(Penson) clazz.newInstance();
//第二种:通过构造方法创建实例
// Constructor c=clazz.getConstructor(null);//获取无参数的构造方法
// Penson p= (Penson) c.newInstance(null);//为参数赋值
//第三种:传参数object接收后,通过object创建实例
Penson p= (Penson) o.getClass().newInstance();
System.out.println(p);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 反射字段
* */
public static void setAndGetField() {
try {
//加载类,注意:加载类时,需要把包名也写入,这里的Penson没有包名,是因为直接建在default包的
Class classzz=Class.forName("Penson");
//实例化类
Penson p= (Penson) classzz.newInstance();
/********************获得所有字段**********************************/
Field[] f= classzz.getFields();
System.out.println("字段名:");
//遍历所有字段,并且输出字段名
for (Field field : f) {
System.out.println(field.getName());
}
System.out.println("字段值:");
for (Field field : f) {
//要拿到字段的值,必须传个对象,说明是我要调用的是这个对象里面的字段
System.out.println(field.get(p));
}
/************************获取指定的字段和为其赋值***************************************/
System.out.println("为字段的赋值:");
//获取指定的字段
Field f1= classzz.getField("age");
//设置字段的值
f1.set(p, 12);
System.out.println("age="+classzz.getField("age").get(p));
/************************获取私有字段****************************************/
System.out.println("私有成员:");
f1=classzz.getDeclaredField("job");//获取私有字段
f1.setAccessible(true);//暴力反射,如果不通过暴力反射,则拿不到私有的成员
f1.set(p, "学生");//为job字段赋值
System.out.println("obj="+f1.get(p));//获取job字段的值
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 反射方法
* */
public static void getMethod() {
try {
//加载类
Class clazz= Class.forName("Penson");
//实例化对象
Penson p=(Penson) clazz.newInstance();
/********************获取所有方法,除了私有*******************************/
Method[] ms= clazz.getMethods();//获取所有方法
//输出所有方法名
System.out.println("方法名:");
for (Method method : ms) {
System.out.println(method.getName());
}
//运行方法
for (Method method : ms) {
try {
//调用p对象中的带几个参数的方法
method.invoke(p, null);
} catch (Exception e) {
}
}
/*********************调用指定带2个参数的方法***************************/
Method m= clazz.getMethod("say", String.class,int.class);//获取带两个参数的方法的对象
m.invoke(p, "张三",23);//运行方法,并给定参数
/**********************获取静态方法******************************************/
m=clazz.getMethod("sayStatic", null);
m.invoke(null, null);//因为静态方法可以不给对象名,也可以给m.invoke(p, null);
/*************************获取私有方法*******************************************/
m=clazz.getDeclaredMethod("says", null);
m.setAccessible(true);//暴力反射
m.invoke(p, null);
/*************************获取带返回类型的方法********************************************/
m=clazz.getMethod("sayReturn", null);
//判断返回类型
if(m.getReturnType()==int.class){
int num=(Integer)m.invoke(p, null);
System.out.println(num);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 反射构造方法
* */
public static void getConstructor() {
try {
//加载类
Class clazz= Class.forName("Penson");
//实例化对象
Penson p=(Penson) clazz.newInstance();
/***********************获取公共的构造方法*********************************/
Constructor[] cons=clazz.getConstructors();
System.out.println("公共的构造方法:");
for (Constructor constructor : cons) {
System.out.println(constructor.getName());
}
/**********************获取指定构造方法*************************************/
Constructor constructor=clazz.getConstructor(int.class,String.class);//获取指定的构造函数
Penson p1= (Penson) constructor.newInstance(12,"张三");//通过构造方法创建penson实例
System.out.println(p1.name);
} catch (Exception e) {
e.printStackTrace();
}
}
}