反射机制的简单代码

获取运行时类的三种方式
1.Class c1= class.forName(“类全名”)
2.通过对象 d= 对象.class Class c2=integer.class
3.通过getClass()方法 Class c3= new Integer(11).getClass()

通过反射创建堆内存对象
例如Date date=new Date();
//想创建谁的对象就在forName("")方法中写谁的类全名
Class c1=Class.forName(“java.util.Date”);
//此时newInstance()相当于new Date();
Object o1=c1.newInstance();

可变长参数 int…就等于int[],只是调用的时候int[]传递数组,
int… 调用方法m1(1,3,4,5,6) 传递的数据会封装到数组a中
int…这种写法在一个参数列表中只能出现一次,并且必须是最后一个参数,
m1(String name, int… i)
m1(int… a){
}

获取所有公共变量
先获取运行时类
Class c=Class.forName(“java.lang.String”);
Field[] fs=c.getFields();
获取所有的变量,包括私有
fs=c.getDeclaredFields();

//获取每一个变量
for(Field field : fs){
//修饰符
//getModifiers 获取修饰符 返回int
int i=field.getModifiers();
//把int 值 转换为对应的修饰符列表
String strModifier=Modifier.toString(i);
//数据类型
Class type=field.getType();
//type.getName:获取类全名 比如 java.lang.String
type.getSimpleName()+" " 获取简称,比如String
//变量名 变量对象.getName()
field.getName();

获取指定变量
先获取运行时类
Class c=Class.forName(“java.lang.Integer”);
//获取指定变量
Field f=c.getDeclareField(“value”);
Modifier.toString(field.getModifiers());
field.getType().getSimpleName()+" " 获取简称,比如String
//变量名 变量对象.getName()
field.getName();

修改私有化对象变量
Class c=Class.forName(“com.User”);
Object o= c.newInstance();
Field f=c.getDeclaredField(“id”);
//打破封装,操作私有化变量
f.setAccessible(true);
//Field变量.set(变量所在对象,值); 变量所在对象也就是新创建运行时的o对象
f.set(o,2);

修改public 对象变量
c.getDeclaredField(“age”).set(o,18); //把o对象里的age属性设为18

获取所有的方法
先获取运行时类
Class c=Class.forName(“java.lang.String”);
//获取所有的方法,包括私有
Method[] ms=cs.getDeclaredMethods();
//每一个方法
for(Method method:ms){
//修饰符
sout(Modifier.toString(method.getModifiers())+" “)
//返回值
Class returnType=method.getReturnType();
// returnType.getName() 返回值全名
returnType.getSimpleName() 返回值简称
//方法名
method.getName()
//参数列表
Class[] parametersTypes=method.getParameterTypes();
for(Class parameterType: parametersTypes){
sout(parametersType.getSimpleName()+” ,");
}

获取指定方法
先获取运行时类
Class c=Class.forName(“java.lang.String”);
//例如获取equals()
Method[] m=cs.getDeclaredMethod(“equals”,Object.class); //第一个参数是方法名,第二个是参数列表
//修饰符
sout(Modifier.toString(m.getModifiers())+" “)
//返回值
Class returnType=m.getReturnType();
// returnType.getName() 返回值全名
returnType.getSimpleName() 返回值简称
//方法名
m.getName()
//参数列表
Class[] parametersTypes=m.getParameterTypes();
sout(parametersType.getSimpleName()+” ,");

}

方法调用
获取方法
Class c=Class.forName("(方法地址)com.Login");
Method method=c.getDeclareMethod(“login”,String.class,String.class);
//打破封装,破解私有化方法
method.setAccessible(true);
Object o=c.newInstance();
//语法结构, 方法对象.invoke(方法所在对象,参数);
Object result=method.invoke(o,“admin”,“root”);

获取所有构造方法
获取运行时类
Class c=Class.forName(“构造方法所在类”);
//获取所有构造方法
Constructor[] cs=c.getConstructors();
for(Constructor constructor:cs){
//修饰符
sout(Modifier.toString(consturctor.getModifiers())+" “);
//方法名没有简称.但是方法名就是类名,可以用类名.简称调用
sout(c.getSimpleName()+” “);
//方法名
sout(constructor.getName()+” “);
//参数列表
Class[] parametersTypes=construector.getParameterTypes();
for(Class parameterType: parametersTypes){
sout(parameterType.getSimpleName()+” ");
}

根据指定构造方法创建对象
获取运行时类
Class c=Class.forName(“构造方法所在类”);
Object o =c.newInstance(); newInstance 是调用无参构造的 没有无参构造会报错
o.setAccessible(true); //给构造方法设置打破封装可以打破单例私有化
// 获取指定参数的构造方法
Constructor constructor=c.getDeclaredConsturctor(int.class);
//创建指定参数构造方法的实例化
Object object=constructor.newInstance(123);

通过反射获取父类类型
Class c=Class.forName(“所在类”);
//获取父类
Class superClass=c.getSuperclass();
sout(superClass);

//获取父接口
Class[] ins=c.getInterfaces();
for(Class class1:ins){
sout(class1);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值