一,问题
今天看Spring AOP的时候,有涉及Java的反射机制。想到自己这方面很久没碰了,就去玩一下。想不到反射真的强大的,哈哈哈!!!文章最后面有源代码。
二,解决方案
2.1 利用获取Class类的三种方式
①通过全限定名: Class c = Class.forName("top.kolo.polo.User");
②通过类名: Class c = User.class;
③通过对象: Class c = user.getClass();
2.2 利用Class类操作类的构造函数、字段、方法
App类:
public class App
{
public static void main( String[] args )
{
//获取Class类的三种方式
// ①通过全限定名: Class c = Class.forName("top.kolo.polo.User");
// ②通过类名: Class c = User.class;
// ③通过对象: Class c = user.getClass();
try {
Class c = Class.forName("top.kolo.polo.User");
System.out.println(c.getName());
System.out.println("==================利用反射操作构造函数========================");
//操作构造函数
//调用无参构造函数,同时取消对方法的权限访问
Constructor noArgConstructor = c.getDeclaredConstructor();
noArgConstructor.setAccessible(true);
User defaultUser = (User)noArgConstructor.newInstance();
System.out.println(defaultUser.toString());
//调用有参的构造函数
Constructor argConstructor = c.getDeclaredConstructor(int.class, String.class);
argConstructor.setAccessible(true);
User initUser = (User)argConstructor.newInstance(18,"kolo");
System.out.println(initUser.toString());
System.out.println("==================利用反射操作字段========================");
//操作字段
//获取所有定义的字段,包括private和protected。同时取消对字段的权限验证
Field[] fields = c.getDeclaredFields();
//先获取这个类的全部字段类型
for (Field f: fields
) {
f.setAccessible(true);
//f.get(对象)表示从这个对象中获取这个字段的值。其中f表示字段名
System.out.println(f.getName() + " " + f.get(initUser));
}
System.out.println("==================利用反射操作方法========================");
//操作方法
//获取所有定义的方法,包括private和protected
Method[] methods = c.getDeclaredMethods();
for (Method m: methods
) {
System.out.println(m.getName());
}
//先获取指定的方法,然后再指定需要执行的方法的对象
Method setNameMethod = c.getMethod("setName", String.class);
setNameMethod.invoke(initUser,"jack");
Method method = c.getMethod("say");
method.invoke(initUser);
} catch (Exception e) {
e.printStackTrace();
}
}
}
User类:
public class User {
private int age;
private String name;
User(){
}
User(int age , String name){
this.age = age;
this.name = name;
}
public void say(){
System.out.println("我是:"+this.name);
System.out.println("哈哈哈,嘿嘿嘿!");
}
public void write(){
System.out.println("我在写字呢!!!");
}
protected void tell(){
System.out.println("啊啊啊!!");
}
private void heart(){
System.out.println("这是私有方法!");
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}