Java反射的基本操作
2015-11-25 20:16
411 查看
-----获取类的信息以及方法的反射和深入理解泛型,代码主要实现:
1.获取类的信息,先创建类的类类型(也可以理解成为class字节码)
2.方法反射的基本操作,以及通过反射深入理解泛型
实例如下:
另一个类:
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>
相关文章推荐
- Java中常用的正则表达式
- Java中常用的正则表达式
- Java 中Log4j的使用详情
- Java 中Log4j的使用详情
- Hibernate 映射类型与Java 类型对照
- Java中的五种单例模式
- Java中的五种单例模式
- Java多种方式读文件,追加文件内容,等对文件的各种操作
- Java多种方式读文件,追加文件内容,等对文件的各种操作
- Myeclipse修改编码字符UTF-8
- Java用WebSocket + tail命令实现Web实时日志
- struts中的函数自动执行的问题
- Java源码剖析之server2008上拉不出验证码
- Java中volatile的使用。。。
- MyEclipse代码自动补全设置
- 黑马程序员——JDK的新特性笔记整理
- 总结Spring、Hibernate、Struts2官网下载jar文件
- struts2的s:iterator 标签 详解
- 补充myeclipse引入MySQL
- Eclipse、idea 集成SVN插件相关问题