反射

反射的三种方法:

Class:

package cn.gzsxt.test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class TestClass {

public static void main(String[] args) {

try {
//1.由于Class类没有公共构造方法,所有创建Class的对象的方法有以下几种:
//①通过Class.forName()静态方法返回Class类的一个实例
Class cls = Class.forName("cn.gzsxt.test.Dog");
//②通过类名.class来获取一个Class类的实例
//cls = Dog.class;
//③代码运行在非静态区,通过this.getClass()获取Class类的一个实例
//Class cls = this.getClass();


//2.Class对象既然是描述一个类,那么我们通过该Class的实例能够做什么事情呢?
//类的属性
//获取类名
System.out.println(cls.getName());
System.out.println(cls.getSimpleName());
//获取类的修饰限定符
int modi = cls.getModifiers();
System.out.println(modi);

//获取一个类的属性
//根据一个属性名获取一个public属性的描述
Field field = cls.getField("name");
//获取一个类的全部public属性的描述
Field[] fields = cls.getFields();
System.out.println(fields.length);

//根据一个属性名获取一个在类中声明的属性的描述
Field declaredField = cls.getDeclaredField("gender");
//获取所有在类中声明的属性的描述
Field[] declaredFields = cls.getDeclaredFields();

//获取一个类的方法
//根据一个方法的名字获取类中的一个public的方法的描述
Method method = cls.getMethod("run", String.class,int.class);
//获取所有在类中是public的方法的描述
Method[] methods = cls.getMethods();

//根据一个方法名获取在类中声明的一个方法的描述
Method declaredMethod = cls.getDeclaredMethod("eat", null);
//获取所有在类中声明的方法的描述
Method[] declaredMethods = cls.getDeclaredMethods();

//返回cls所代表的类的实例
Object obj = cls.newInstance();
System.out.println(obj);

/*Constructor c = cls.getConstructor(String.class);
c.newInstance("aaa");*/


} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}

}
}

Field:

package cn.gzsxt.test;

import java.lang.reflect.Field;

public class TestField {

public static void main(String[] args) {

Class cls = Dog.class;

//获取其属性
try {
//使用Filed类的一个实例,来描述cls类的实例中的"一个"属性
Field field = cls.getDeclaredField("gender");
//获取属性的名字
System.out.println(field.getName());
//获取属性的类型
Class strcls = field.getType();
System.out.println(strcls.getName());
//获取属性的限定符
int modifiers = field.getModifiers();
System.out.println(modifiers);

//创建Dog类的一个对象
Dog d = new Dog("旺财","母");

//暴力设置:设置field的访问
//field.setAccessible(true);

//有d对象,希望给d对象的gender属性赋值,可以使用set方法
//field.set(d, "公");
//返回d对象的gender属性的值,可以使用get方法
System.out.println(field.get(d));


} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}

}

Method:

Method1:

package cn.gzsxt.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Iterator;

public class TestMethod {

public static void main(String[] args) {


Class cls = Dog.class;

//通过cls.getDeclaredMethod获取Method对象
try {
// Method m = cls.getDeclaredMethod("run", String.class,int.class);
Method m = cls.getDeclaredMethod("eat", null);

//获取方法名
System.out.println(m.getName());

//方法的返回值类型
Class returntype = m.getReturnType();
System.out.println(returntype.getName());

//方法的参数类型
Class[] paraType = m.getParameterTypes();
for (int i = 0; i < paraType.length; i++) {
System.out.println(paraType[i].getName());
}

//获取方法的修饰符
int modifiers = m.getModifiers();


Dog d = new Dog("旺财", "母");

//方法是可以执行的,使用invoke执行method对象所表示的方法
//m.invoke(d, "aaa",123);
m.invoke(d, null);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}

}
}

Method2:

package cn.gzsxt.test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import cn.gzsxt.model.Person;

public class TestMethod2 {

public static void main(String[] args) {

Person p = new Person();
//使用反射相关类,为对象p设置name属性的值
Class cls = p.getClass();
Field[] fs = cls.getDeclaredFields();
for (int i = 0; i < fs.length; i++) {
Field f = fs[i];
if(f.getName().equals("name")) {
String setName = "set"+f.getName().substring(0, 1).toUpperCase()+ f.getName().substring(1);
//设置器的形参和属性的类型应当一致
try {
Method m = cls.getDeclaredMethod(setName, f.getType());
//相当于p方法调用了setName方法
m.invoke(p , "zhangsan");
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
System.out.println(p.getName());

}
}


}

转载于:https://www.cnblogs.com/CTR614308155/p/10757909.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值