1.反射机制是什么:

(1)反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

(2)理解:JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

python为何称为动态语言:例:

class person

def _init_ (self, name=None,age=None)

  self.name=name

  self.age=age

p=person("tgz","5")

p.sex=male

这时候就发现问题了,我们定义的类里面没有sex这个属性啊!怎么回事呢? 这就是动态语言的魅力和坑! 这里 实际上就是 动态给实例绑定属性!

2.反射机制的功能:

反射机制主要提供了以下功能:

  • 在运行时判断任意一个对象所属的类;

  • 在运行时构造任意一个类的对象;

  • 在运行时判断任意一个类所具有的成员变量和方法;

  • 在运行时调用任意一个对象的方法;

  • 生成动态代理。

3.反射机制获取类有三种方法:

例:

  1. package practice1;
  2. import java.lang.Class; public class tgztext {
  3. public static void main(String []args) throws Exception{
  4. Class<?> class1=null;
  5. Class<?> class2=null;
  6. Class<?> class3=null;
  7. class1=Class.forName("practice1.tgztext");
  8. class2=new tgztext().getClass();
  9. class3=tgztext.class;
  10. System.out.println(class1.getName());
  11. System.out.println(class2.getName());
  12. System.out.println(class3.getName());
  13. }
  14. }

4.获取一个对象的父类与实现接口

getSuperclass() getInterfaces()

  1. package practice1;
  2.  
  3. import java.lang.Integer;
  4. import java.lang.reflect.Field;
  5. import java.lang.reflect.Method;
  6. import java.lang.Class;
  7. import java.lang.reflect.Modifier;
  8. import java.lang.reflect.Constructor;
  9. public class tgztext {
  10. public static void main(String []args) throws Exception{
  11. Class <?> clazz=Class.forName("practice1.tgztext");
  12. Class<?>parentClass=clazz.getSuperclass();
  13. System.out.println("clazz的父类为:"+parentClass.getName());
  14. Class <?>interfaces[]=clazz.getInterfaces();
  15. for(int i=0;i<interfaces.length;i++)
  16. {
  17. System.out.println(interfaces[i].getName());
  18. }
  19. }
  20. }

5.通过反射机制实例化一个类的对象

  1. //第一种方法,实例化默认构造方法,调用set赋值
    Class <?> clazz=null;
  2. clazz=Class.forName("practice1.user");
  3. System.out.println(clazz.getName());
  4. user user1=(user) clazz.newInstance();
  5. user1.setAge(10);
  6. user1.setName("qwe");
  7. System.out.println(user1);
  8. user user4=new user(10,"pdd");
  9. System.out.println(user4);
  10. //第二种方法 取得全部构造函数 用构造函数赋值
  11. Constructor<?> cons[]=clazz.getConstructors();
  12. for(int i=0;i<cons.length;i++)
  13. {
  14. Class<?> classes[]=cons[i].getParameterTypes();
  15. System.out.print("cons["+i+"](");
  16. for(int j=0;j<classes.length;j++)
  17. {
  18. if(j==classes.length-1)
  19. System.out.print(classes[j].getName());
  20. else
  21. System.out.print(classes[j].getName()+",");
  22. }
  23. System.out.println(")");
  24. }
  25. user user2=(user) cons[1].newInstance("asd");
  26. System.out.println(user2);

6.获取某个类的全部属性

Field[] field = clazz.getDeclaredFields();

取得实现的接口或者父类的属性

Field []fields1=clazz.getFields();

  1. Class<?>clazz =Class.forName("practice1.tgztext");
  2. //取得本类的全部属性
  3. Field[] fields=clazz.getDeclaredFields();
  4. for(int i=0;i<fields.length;i++)
  5. {
  6. //权限修饰符
  7. int mo=fields[i].getModifiers();
  8. String priv=Modifier.toString(mo);
  9. //属性类型
  10. Class<?>type=fields[i].getType();
  11. System.out.println(priv+" "+type.getName()+" "+fields[i].getName());
  12. }
  13.  
  14. //实现的接口或父类属性
  15. Field []fields1=clazz.getFields();
  16. for(int i=0;i<fields1.length;i++)
  17. {
  18. //权限修饰符
  19. int mo=fields1[i].getModifiers();
  20. String priv=Modifier.toString(mo);
  21. //属性类型
  22. Class<?>type=fields1[i].getType();
  23. System.out.println(priv+" "+type.getName()+" "+fields1[i].getName());
  24. }

7.获取某个类的全部方法

Method[] method=clazz.getMethods();

8.通过反射机制调用某个类的方法

  1. Class<?>clazz =Class.forName("practice1.tgztext");
  2. Method[] method=clazz.getMethods();
  3. for(int i=0;i<method.length;i++)
  4. {
  5. Class<?>returnType=method[i].getReturnType();
  6. Class<?> param[]=method[i].getParameterTypes();
  7. int temp=method[i].getModifiers();
  8. System.out.print(Modifier.toString(temp)+" ");
  9. System.out.print(returnType.getName()+" ");
  10. System.out.print(method[i].getName());
  11. System.out.print("(");
  12. for(int j=0;j<param.length;j++)
  13. {
  14. System.out.print(param[j].getName()+" "+"args"+j);
  15. if(j<param.length-1)
  16. {
  17. System.out.print(",");
  18. }
  19. }
  20. Class<?>exce[]=method[i].getExceptionTypes();
  21. if(exce.length>0)
  22. {
  23. System.out.print(")throws ");
  24. for(int k=0;k<exce.length;k++)
  25. {
  26. System.out.print(exce[k].getName()+" ");
  27. if(k<exce.length-1)
  28. {
  29. System.out.print(",");
  30. }
  31. }
  32. }
  33. else{
  34. System.out.print(")");}
  35. System.out.println();
  36. }

通过反射机制调用某个类的方法

method=clazz.getMethod("reflect2", int.class,String.class);

method.invoke(clazz.newInstance(), 20,"张三");

  1. public static void main(String []args) throws Exception{
  2. Class<?>clazz=Class.forName("practice1.tgztext");
  3. Method method=clazz.getMethod("reflect1");
  4. method.invoke(clazz.newInstance());
  5. method=clazz.getMethod("reflect2", int.class,String.class);
  6. method.invoke(clazz.newInstance(), ,"张三");
  7. }
  8. public void reflect1()
  9. {
  10. System.out.println("a");
  11. }
  12. public void reflect2(int age,String name)
  13. {
  14. System.out.println(age+name);
  15. }

java 反射机制的更多相关文章

  1. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  2. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  3. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  4. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  5. Java反射机制专题

    ·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...

  6. java反射机制深入详解

    java反射机制深入详解  转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...

  7. Java反射机制DOME

    Java反射机制 public class TestHibernate { @Test public void TestHb(){ try { Class cs = Class.forName(&qu ...

  8. 反射——Java反射机制

    反射概述 什么是反射? ①   反射的概念是由Smith在1982年首次提出的,主要指程序可以访问.检测和修改它本身状态或行为的一种能力. ②   JAVA反射机制是在运行状态中,对应任意一个类,都能 ...

  9. Java反射机制可以动态修改实例中final修饰的成员变量吗?

    问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...

  10. Java反射机制学习与研究

    Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...

随机推荐

  1. iOS 多快好省的宏定义

    http://my.oschina.net/yongbin45/blog/150149 // 字符串:#ifndef nilToEmpty#define nilToEmpty(object) (obj ...

  2. 中间人攻击(MITM)姿势总结

    相关学习资料 http://www.cnblogs.com/LittleHann/p/3733469.html http://www.cnblogs.com/LittleHann/p/3738141. ...

  3. C#中UnixTime和DateTime的转换(转载)

    由于在API请求中返回回来的时间格式为UNIX形式,需要转换成正常的显示方式,在网上找到了这么一个例子. 使用是在C#中使用的,所以WP8开发应该也可以. 转载源地址:http://blog.linu ...

  4. tornado 学习笔记10 Web应用中模板(Template)的工作流程分析

             第8,9节中,我们分析Tornado模板系统的语法.使用以及源代码中涉及到的相关类,而且对相关的源代码进行了分析.那么,在一个真正的Web应用程序中,模板到底是怎样使用?怎样被渲染? ...

  5. python语句

    print语句 print函数中使用逗号输出多个表达式,打印的结果之间使用空格隔开. >>> ') name: zyj age: 24 >>> print(1,2, ...

  6. ZeroMQ接口函数之 :zmq_getsockopt – 获取ZMQ socket的属性

    ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html 本文地址 :http://www.cnblogs.com/fengbo ...

  7. 一些关于Viewport与device-width的东西~

    进行移动web开发已经有一年多的时间了,期间遇到了一些令人很困惑的东西.比如: 我们经常使用的<meta name="viewport" content="widt ...

  8. css3新特性

    1.css3选择器   我们所定义的 CSS 属性之所以能应用到相应的节点上,就是因为 CSS 选择器模式.参考下述代码: Body > .mainTabContainer div > s ...

  9. Ubuntu14.04安装wineqq国际版

       一开始,我在Ubuntu14.04下安装的QQ版本是WineQQ2013SP6-20140102-Longene, 但后来发现这个版本QQ在linux下问题很多,比如不能用键盘输入密码,QQ表情 ...

  10. C指针-数组和指针的归一

    int bArr[] = {1,2,3}; int *iarr = bArr; *iarr = 6; printf("%d\n",*iarr); printf("%d\n ...