您的位置:首页 > 编程语言 > Java开发

Java反射的基本操作

2015-11-25 20:16 411 查看
-----获取类的信息以及方法的反射和深入理解泛型,代码主要实现:

1.获取类的信息,先创建类的类类型(也可以理解成为class字节码)

2.方法反射的基本操作,以及通过反射深入理解泛型

实例如下:

<span style="font-size:24px;">package MethodMessage;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class demo1 {
//获取类的方法名,返回值,以及参数类型
public void  show(Object obj){
//先获得类的类类型
Class  c= obj.getClass();
//再获取类的所有方法
Method[] methods= c.getMethods();
//遍历类的所有方法
for(int i=0;i<methods.length;i++){
//先获得方法的返回值的类类型
Class  returnType= methods[i].getReturnType();
System.out.print("方法的返回值类型为:"+returnType.getSimpleName()+"  ");
//再输出方法的名称
String methodName= methods[i].getName();
System.out.print("方法的名称为:"+methodName+"  ");
//再输出方法的返回值
Class[]  fanhuizhi= methods[i].getParameterTypes();
//循环打印出方法的参数类型
System.out.print("方法参数的类型:"+"(");
for(int k=0;k<fanhuizhi.length;k++){
if(k==fanhuizhi.length-1){
System.out.println(fanhuizhi[k].getSimpleName());
}else{
System.out.print(fanhuizhi[k].getSimpleName()+",");
}
}
System.out.print(")");

System.out.println();
}
}

//得到类构造函数
public void  getMember(Object obj){
Class c=obj.getClass();
Constructor[]	constructors=c.getDeclaredConstructors();
//进行遍历
for (Constructor constructor : constructors) {
String  name=constructor.getName();
System.out.print("类的构造方法名为:"+name);
//获得构造函数的参数类型
Class[]  type=constructor.getParameterTypes();
for (Class class1 : type) {
System.out.print("("+class1.getSimpleName()+",");
}
System.out.println(")");
}
}
//获得成员变量的方法
public void getVariable(Object obj){
Class c=obj.getClass();
Field[] field= c.getDeclaredFields();
for (Field field2 : field) {
System.out.println(c.getSimpleName()+"类的成员变量为:"+field2.getName());
}
}
}
</span>


另一个类:
<span style="font-size:24px;">package MethodMessage;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

class A{
public void print(int a,int b){
System.out.println(a+b);
}
public void print(String a,String b){
System.out.println(a.toUpperCase()+b.toUpperCase());
}
}
public class Test extends In{

public static void main(String[] args) {
demo1  d= new demo1();
String  s="sasa";
//d.getVariable(s);
//fanxing();
try {
fanshe();
} catch (Exception e) {
e.printStackTrace();
}
}
//方法反射的基本操作
public static void fanshe()  throws Exception{
//		A a= new A();
//		a.print(10, 20);
//		a.print("asc", "efg");
//先获得类的类类型
Class a=A.class;
//再获得方法的类类型
Method	m1 = a.getMethod("print",int.class,int.class);
//如果方法有返回值则返回具体的返回值,没有则返回null
Object o=m1.invoke(new A(), new Object[]{10,10});
Method m2=a.getMethod("print", String.class,String.class);
m2.invoke(new A(), "abc","efg");
}

//通过java的反射深入了解泛型
public static  void  fanxing(){
ArrayList list1= new ArrayList();
ArrayList<String> list2= new ArrayList<String>();
//获得集合的类类型
Class  c1=list1.getClass();
Class  c2=list2.getClass();
//输出结果为true,说明编译时去泛型的
System.out.println(c1==c2);
//错误代码,直接往list2中添加非String变量时错误的,但是我们可以通过方法的反射绕过泛型
//list2.add(20);
try {
Method method=c2.getMethod("add",Object.class);
//将int类型数据添加到String泛型的集合中
method.invoke(list2, 20);
//打印list2中的内容进行验证
System.out.println(list2);
} catch (Exception e) {
e.printStackTrace();
}
}
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: