本文主要对java反射的简单应用,获取字节码,类的字段、方法,调用方法等!掌握基础,日后可以举一反三!
效果展示:
源码:
/**
* 反射的简单运用
* @author Smilexs
*/
public class TestReflect {
public static void main(String[] args) throws Exception{
/**1、获取类的字节码*/
Class c = Class.forName("com.itheima.Person");
/**2、通过构造器获取实例*/
System.out.println("---------------实例内容---------------");
Constructor con = c.getConstructor(String.class,int.class,boolean.class);
Person p = (Person)con.newInstance(new Object[]{"小里",18,true});
System.out.println("姓名:"+p.getName()+"\t年龄:"+p.getAge()+"\t性别:"+(p.isSex()==true?"男":"女"));
/**3、输出所有字段*/
System.out.println("---------------字段名---------------");
Field[] fields = c.getDeclaredFields();//可以返回私有字段
for (Field field : fields) {
System.out.println(field.getName());
}
/**4、输出所有方法*/
System.out.println("---------------方法名---------------");
// Method[] methods = c.getMethods();//不会输出私有方法名
Method[] methods = c.getDeclaredMethods();//输出所有申明的方法
for (Method method : methods) {
System.out.println(method.getName()+"()");
}
/**5、调用方法*/
System.out.println("---------------调用方法内容---------------");
for (Method method : methods) {
if(method.getName()=="print"){
method.setAccessible(true);//设置可以访问私有方法,暴力反射
System.out.println(method.invoke(p, "hello world!"));
}
}
}
}
/**
* 个人信息
*/
public class Person {
public String name ;
private int age;
private boolean sex;
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String name, int age, boolean sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
private String print(String content){
return "显示内容为:"+content;
}
}