通过一个对象获得完整的包名和类名

  1. package reflect;
  2.  
  3. public class GetClass {
  4. public static void main(String[] args) {
  5. GetClass c=new GetClass();
  6. System.out.println(c.getClass().getName());
  7. System.out.println("结果是reflect.GetClass");
  8. Demo d=new Demo();
  9. System.out.println(d.getClass().getName());
  10. System.out.println("结果是reflect.Demo");
  11. }
  12. }
  13. class Demo{
  14.  
  15. }

 

所有类的对象其实都是Class的实例。

实例化class对象

  1. package reflect;
  2.  
  3. public class GetClass {
  4. public static void main(String[] args) {
  5. Class<?> demo1=null;
  6. Class<?> demo2=null;
  7. Class<?> demo3=null;
  8. demo1=Demo.class;
  9. demo2=new Demo().getClass();
  10. try {
  11. demo3=Class.forName("reflect.Demo");
  12. } catch (ClassNotFoundException e) {
  13. e.printStackTrace();
  14. }
  15. System.out.println("demo1,2,3的值是class reflect.Demo");
  16. System.out.println("类名称 "+demo1.getName());
  17. System.out.println("类名称 "+demo2.getName());
  18. System.out.println("类名称 "+demo3.getName());
  19. System.out.println("他们的值都是reflect.Demo");
  20. }
  21. }
  22. class Demo{
  23.  
  24. }

  

通过一个类获取其所有的属性

 

  1. package reflect;
  2.  
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.Modifier;
  5.  
  6. public class hello {
  7. public static void main(String[] args) {
  8. /*获取本类的全部属性*/
  9. Class<?> demo = null;
  10. /* try {
  11. demo=Class.forName("reflect.Demo");
  12. } catch (ClassNotFoundException e) {
  13. e.printStackTrace();
  14. } */
  15. // demo=Demo.class;
  16. demo=new Demo().getClass();
  17. //获取某个类所声明的字x段(包括public、private、protected)
  18. Field[] field=demo.getDeclaredFields();
  19. for(int i=0;i<field.length;i++){
  20. //返回修饰符的编码
  21. int mo=field[i].getModifiers();
  22. //获取修饰符名称
  23. String decorate=Modifier.toString(mo);
  24. //输出修饰符名称
  25. System.out.println(decorate);
  26. //获取属性类型
  27. Class<?> type=field[i].getType();
  28. //输出属性类型
  29. System.out.println(type);
  30. //获取属性名称
  31. System.out.println(field[i].getName());
  32.  
  33. //如果要获取其自身的属性和其父类或者接口的属性,用
  34. //Field[] field=demo.getFields();这个方法
  35. }
  36. }
  37. }
  38. class Demo{
  39. public String name;
  40. public String age;
  41. private int id;
  42.  
  43. }

 输出结果是

  1. public
  2. class java.lang.String
  3. name
  4. public
  5. class java.lang.String
  6. age
  7. private
  8. int
  9. id

通过class调用其他类中的构造函数

  1. package Reflect;
  2.  
  3. import java.lang.reflect.Constructor;
  4.  
  5. class Person{
  6.      
  7.     public Person() {
  8.          
  9.     }
  10.     public Person(String name){
  11.         this.name=name;
  12.     }
  13.     public Person(int age){
  14.         this.age=age;
  15.     }
  16.     public Person(String name, int age) {
  17.         this.age=age;
  18.         this.name=name;
  19.     }
  20.     public String getName() {
  21.         return name;
  22.     }
  23.     public int getAge() {
  24.         return age;
  25.     }
  26.     @Override
  27.     public String toString(){
  28.         return "["+this.name+"  "+this.age+"]";
  29.     }
  30.     private String name;
  31.     private int age;
  32. }
  33.  
  34. class hello{
  35.     public static void main(String[] args) {
  36.         Class<?> demo=null;
  37.         try{
  38.             demo=Class.forName("Reflect.Person");
  39.         }catch (Exception e) {
  40.             e.printStackTrace();
  41.         }
  42.         Person per1=null;
  43.         Person per2=null;
  44.         Person per3=null;
  45.         Person per4=null;
  46.         //取得全部的构造函数
  47.         Constructor<?> cons[]=demo.getConstructors();
  48.         try{
  49.             per1=(Person)cons[0].newInstance();
  50.             per2=(Person)cons[1].newInstance("Rollen");
  51.             per3=(Person)cons[2].newInstance(20);
  52.             per4=(Person)cons[3].newInstance("Rollen",20);
  53.         }catch(Exception e){
  54.             e.printStackTrace();
  55.         }
  56.         System.out.println(per1);
  57.         System.out.println(per2);
  58.         System.out.println(per3);
  59.         System.out.println(per4);
  60.     }
  61. }

【运行结果】:

[null  0]

[Rollen  0]

[null  20]

[Rollen  20]

关于反射中invoke方法的使用

method.invoke(Object obj, Object args[])

obj是个对象,必须是实例化的对象。args是个用于方法调用的参数,是Object数组,因为参数可能有多个。

Method类代表一个方法,所以invoke(调用)就是调用Method类代表的方法。它可以让你实现动态调用,例如你可以动态的传入参数。

  1. package reflect;
  2.  
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5.  
  6. public class Test {
  7. public static void main(String[] args) {
  8. String [] names ={"tom","tim","allen","alice"};
  9. Class<?> clazz=hi.class;
  10. Method method = null;
  11. try {
  12. method=clazz.getMethod("sayHi", String.class);
  13. } catch (NoSuchMethodException e) {
  14. e.printStackTrace();
  15. } catch (SecurityException e) {
  16. e.printStackTrace();
  17. }
  18. for(String name:names){
  19. try {
  20. method.invoke(clazz.newInstance(), name);
  21. } catch (IllegalAccessException e) {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. } catch (IllegalArgumentException e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. } catch (InvocationTargetException e) {
  28. // TODO Auto-generated catch block
  29. e.printStackTrace();
  30. } catch (InstantiationException e) {
  31. // TODO Auto-generated catch block
  32. e.printStackTrace();
  33. }
  34. }
  35.  
  36. }
  37.  
  38. }
  39. class hi{
  40. public void sayHi(String name){
  41. System.out.println("hi,"+name);
  42. }
  43. }

 

结果 

hi,tom
hi,tim
hi,allen
hi,alice

 getDeclaredMethod

  1. public Method getDeclaredMethod(String name, Class... parameterTypes) throws NoSuchMethodException, SecurityException

java.lang.Class.getDeclaredMethod()方法返回一个Method对象,它反映此Class对象所表示的类或接口的指定已声明方法。name参数是一个字符串,指定所需的方法的简单名称,parameterTypes参数是一个数组的Class对象识别方法的形参类型,在声明的顺序

例如

  1. Method realMethod = serviceProcessor.getClass().getDeclaredMethod(methodName,JSONObject.class);
  2.  
  3. JSONObject paramJson = (JSONObject) JSONObject.parse(param);
  4.  
  5. String data = ((String) realMethod.invoke(serviceProcessor, paramJson));

 .class和.getClass的区别

出现的时期不同:Class.forName()在运行时加载;Class.class和getClass()是在编译器加载,即.class是静态加载,.getClass()是动态加载。

.getClass()是一个对象实例的方法,只有对象实例才有这个方法,具体的类是没有的。类的Class类实例是通过.class获得的,显然,类没有.getClass()方法。

如:

  1. protected Logger log=Logger.getLogger(this.getClass());
  2. protected static final Logger log=Logger.getLogger(HttpUtil.class);

 注意this是当前类的实例,static表示是静态的 

java反射学习的更多相关文章

  1. Java反射学习系列-绪论

    Java反射学习系列-绪论 https://blog.csdn.net/hanchao5272/article/details/79358924

  2. Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. ...

  3. Java反射学习总结四(动态代理使用实例和内部原理解析)

    通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...

  4. Java 反射学习笔记

    要学反射,先要了解Class这个类,Class是所有Java类的一个总称,Class的实例中存储的是一个类的字节码,获取Class的实例有三种方式: System.class new Date().g ...

  5. Java反射学习:深入学习Java反射机制

    一.Java反射的理解(反射是研究框架的基础之一) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的 ...

  6. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

  7. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

  8. java反射学习笔记

    1.java反射概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功 ...

  9. Java反射学习(java reflect)(二)

    ok之前说了Java的反射和反射分析类,那这些东西有神马作用呢,下面就来说应用: 三.运行时使用反射分析对象 简单写一个Employee类,然后利用JAVA反射去取name域,getDeclareFi ...

  10. JAVA反射学习网摘

    程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动 ...

随机推荐

  1. 如何替换orcl实例下的四个数据库

    1,drop 数据库对应的用户 2,创建新的表空间 新的用户 3,导入新的数据库 imp grid_sysdb/sagis@klmy file=F:\data\addr_interestpoint.d ...

  2. [转]redis.conf的配置解析

    # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等酱紫: # # 1k => 1000 bytes # 1kb ...

  3. PowerDesigner打开设计文件后提示failed to read the fileXXX的解决办法

    擦,一身盗汗.一向的设计信息都在设计图里!竟然坏了,坏了!!!!! 惊.怒.悲 固然可以经由过程数据库当前状况反向工程.然则那么注解.我写的提示这些器材都邑消散. 比来的备份是10天前,恢复也会有必然 ...

  4. ReactNative之style使用指南

    ReactNative中能使用的css样式有哪些呢Valid style props: [   "alignItems",   "alignSelf",   & ...

  5. 抓包工具charles的使用

    Charles是一款抓包修改工具,数据请求控制容易,操作简单. 下载和安装 首先是工具下载和安装 安装前需要先有Java的运行环境.下载到charles的破解版以后,正常安装.一般破解版里会有char ...

  6. android Notification 的使用

    最近一直在研究 android ,并一边研究一边做应用.其中遇到了把程序通知常驻在 Notification 栏,并且不能被 clear 掉(就像android QQ一样)的问题.经过研究实现了其功能 ...

  7. Zxing二维码重复扫描,不退出。

    扫描条码,把手机实现类似超市扫描枪之类的连续扫描. private void continuePreview(){ SurfaceView surfaceView = (SurfaceView) fi ...

  8. C/C++中的结构体

    结构体定义 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.   结构体作用 结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成 ...

  9. [CareerCup] 1.2 Reverse String 翻转字符串

    1.2 Implement a function void reverse(char *str) in C or C++ which reverses a null-terminated string ...

  10. [CareerCup] 9.10 Stack Boxes 垒箱子问题

    9.10 You have a stack of n boxes, with widths w., heights hir and depths drThe boxes cannot be rotat ...