Java反射

Java中提供了Class类,可以通过Class类获取类的定义信息,包括包名、类名、类上的注释(Annotation)、类的修饰符、父类、继承的接口、构造方法、成员变量和成员方法。这些信息分别使用java.lang.annotation.Annotation、 java.lang.reflect.Constructor、java.lang.reflect.Field、java.lang.reflect.Method、java.lang.reflect.Modifier来表示。可以动态调用方法和属性。下面的例子展示了基本用法。

package ch5;

import static java.lang.System.out;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ClassInfo {

public static void main(String args[]){

Class c=String.class;
// 1、得到所有方法
Method[] methods = c.getMethods();
// 2、得到某个方法
try{
// 第一个参数是方法的名字,后面的参数是参数的类型
Method find = c.getMethod("indexOf", int.class);
// 动态调用,第一个参数是对象,后面的参数是方法的实参(采用了变长参数)
System.out.println(find.invoke("hello,welcome!",'c'));
}catch(Exception e){
e.printStackTrace();
}
// 3、得到类的名字
out.println("类的名字为:"+c.getName());
// 4、得到包名,通过Package对象处理
System.out.println("包名为:"+c.getPackage().getName());
// 5、得到修饰符,通过Modifier处理
int modifier = c.getModifiers();
if(Modifier.isPublic(modifier)){
System.out.println("类是公有的!");
}
if(Modifier.isPrivate(modifier)){
System.out.println("类是私有的!");
}
if(Modifier.isFinal(modifier)){
System.out.println("类是最终类!");
}
// 6、得到父类
System.out.println("父类的名字为:"+c.getSuperclass().getName());
// 7、得到实现的接口
System.out.println("实现的接口:");
for(Class cc:c.getInterfaces()){
System.out.print(cc.getName()+",");
}

// 8、得到类上的注释
System.out.println("类上的注释:");
for(Annotation a:c.getAnnotations()){
System.out.print(a.toString());
}

// 9、得到构造方法
System.out.println("构造方法有:");
for(Constructor constructor:c.getConstructors()){
System.out.print(constructor.toString());
}

// 10、创建实例
try{
Object o = c.newInstance();
}catch(Exception e){
e.printStackTrace();
}

// 11、解析方法
for(Method method:methods){
System.out.print("方法名字:"+method.getName());
System.out.print("方法参数列表:");
for(int i=0;i<method.getParameterTypes().length;i++)
System.out.print(method.getParameterTypes()[i].getName()+",");
System.out.print("方法的异常列表:"+method.getExceptionTypes());
System.out.print("方法的返回值类型:"+method.getReturnType());
if(Modifier.isPublic(method.getModifiers())){
System.out.print("方法是公有的");
}
if(Modifier.isStatic(method.getModifiers())){
System.out.print("方法是静态的");
}
System.out.println("方法的修饰符:"+method.getModifiers());
/*
* 返回的修饰符是一个数字,是对多个修饰符的编码,可以通过Modifier来判断是否是包含某个修饰符
* 例如:Modifier.isPublic(method.getModifiers())判断是否包含public修饰符
*/
}

// 12、解析属性
Field[] filds = c.getFields();
for(Field fild:filds){
// 得到属性名字
System.out.print(fild.getName());
// 动态获取属性值
try{
System.out.print("--------"+fild.get("hello,welcome!").toString());
}catch(Exception e){
System.out.println("不能访问!");
}
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值