一、简单的反射例子
/**
* @Title: ReflectTest.java
* @Package com.lss.wy
* @Description: TODO
* @author Licon
* @date 2018年8月14日
* @version V1.0
*/
package com.lss.wy;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/**
* @ClassName: ReflectTest 反射
* @Description: TODO
* @author Licon
* @date 2018年8月14日
*
*/
public class ReflectTest {
//动态传入一个方法名,根据类名来构建类的实例对象
public static void desc(String name) throws ClassNotFoundException {
/*
* 获取内存当中实实在在存在的person这个类的对象
* Person p =new Person();
System.out.println(p.getClass());*/
Class<?> cls = Class.forName("com.lss.wy.Test");
//获取包名
System.out.println(cls.getPackage()+";");
//获取修饰符 +类名
System.out.println(Modifier.toString(cls.getModifiers())+" class "+cls.getSimpleName()+"{");
//反射属性、方法、构造器
/**
* getField(name) 获取对应名称的属性,前提(必须是public)
* getFields():获取所有public修饰的属性
* getDeclaredField(name)获取对应名称的属性,任意的修饰符
* getDeclaredFields 获取任意修饰符的属性
*/
Field[] fields = cls.getDeclaredFields();
if(fields != null && fields.length > 0) {
for (Field field : fields) {
System.out.println("属性:"+field);
}
}
//获取类中所有方法
Method[] methods = cls.getDeclaredMethods();
if(methods != null && methods.length > 0) {
for (Method method : methods) {
System.out.println("方法:"+method);
}
}
//获取类中所有构造器
Constructor<?>[] constructors = cls.getDeclaredConstructors();
if(constructors != null && constructors.length > 0) {
for (Constructor<?> constructor : constructors) {
System.out.println("构造器:"+constructor);
}
}
System.out.println("}");
}
public static void main(String[] args) throws ClassNotFoundException {
//通过反射获取到这个类对象
desc(args[0]);
}
}
/**
* @Title: Test.java
* @Package com.lss.wy
* @Description: TODO
* @author Licon
* @date 2018年8月14日
* @version V1.0
*/
package com.lss.wy;
/**
* @ClassName: Test
* @Description: TODO
* @author Licon
* @date 2018年8月14日
*
*/
public class Test {
public int id;
protected String name;
int age;
private String adress;
public Test() {
}
public Test(int id, String name, int age, String adress) {
this.id = id;
this.name = name;
this.age = age;
this.adress = adress;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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 String getAdress() {
return adress;
}
public void setAdress(String adress) {
this.adress = adress;
}
@Override
public String toString() {
return "Test [id=" + id + ", name=" + name + ", age=" + age + ", adress=" + adress + "]";
}
}
二、反射中需要注意的地方
/**
* @Title: ReflectTest2.java
* @Package com.lss.wy
* @Description: TODO
* @author Licon
* @date 2018年8月15日
* @version V1.0
*/
package com.lss.wy;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import com.lss.wy.Test;
/**
* @ClassName: ReflectTest2
* @Description: TODO
* @author Licon
* @date 2018年8月15日
*
*/
//使用反射调用类对象中的内容
public class ReflectTest2 {
public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
Test t = new Test();
//反射可以构建新对象
Class<? extends Test> cls = t.getClass();
//获取有参构造器
Constructor<? extends Test> constructor = cls.getDeclaredConstructor(int.class,String.class,int.class,String.class);
Test newInstance = constructor.newInstance(1,"wy",22,"hcz");
System.out.println(newInstance.toString());
//getMethod方法中有两个参数
//第一个:表示想要获取的方法名
//第二个:如果该方法需要传参,参数类型写到此处
Method method = cls.getMethod("getName");
/**invoke():执行方法
* 第一个:哪个对象执行
* 第二个:传入的值
*/
System.out.println(method.invoke(newInstance));
/**
* 获取属性
*/
Field adress = cls.getDeclaredField("adress");
//暴力访问,默认为false,不可访问private修饰的内容
adress.setAccessible(true);
Object ad = adress.get(newInstance);
System.out.println(ad);
}
}