java 反射机制
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.反射机制获取类有三种方法:
例:
- package practice1;
- import java.lang.Class; public class tgztext {
- public static void main(String []args) throws Exception{
- Class<?> class1=null;
- Class<?> class2=null;
- Class<?> class3=null;
- class1=Class.forName("practice1.tgztext");
- class2=new tgztext().getClass();
- class3=tgztext.class;
- System.out.println(class1.getName());
- System.out.println(class2.getName());
- System.out.println(class3.getName());
- }
- }
4.获取一个对象的父类与实现接口
getSuperclass() getInterfaces()
- package practice1;
- import java.lang.Integer;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.lang.Class;
- import java.lang.reflect.Modifier;
- import java.lang.reflect.Constructor;
- public class tgztext {
- public static void main(String []args) throws Exception{
- Class <?> clazz=Class.forName("practice1.tgztext");
- Class<?>parentClass=clazz.getSuperclass();
- System.out.println("clazz的父类为:"+parentClass.getName());
- Class <?>interfaces[]=clazz.getInterfaces();
- for(int i=0;i<interfaces.length;i++)
- {
- System.out.println(interfaces[i].getName());
- }
- }
- }
5.通过反射机制实例化一个类的对象
- //第一种方法,实例化默认构造方法,调用set赋值
Class <?> clazz=null;- clazz=Class.forName("practice1.user");
- System.out.println(clazz.getName());
- user user1=(user) clazz.newInstance();
- user1.setAge(10);
- user1.setName("qwe");
- System.out.println(user1);
- user user4=new user(10,"pdd");
- System.out.println(user4);
- //第二种方法 取得全部构造函数 用构造函数赋值
- Constructor<?> cons[]=clazz.getConstructors();
- for(int i=0;i<cons.length;i++)
- {
- Class<?> classes[]=cons[i].getParameterTypes();
- System.out.print("cons["+i+"](");
- for(int j=0;j<classes.length;j++)
- {
- if(j==classes.length-1)
- System.out.print(classes[j].getName());
- else
- System.out.print(classes[j].getName()+",");
- }
- System.out.println(")");
- }
- user user2=(user) cons[1].newInstance("asd");
- System.out.println(user2);
6.获取某个类的全部属性
Field[] field = clazz.getDeclaredFields();
取得实现的接口或者父类的属性
Field []fields1=clazz.getFields();
- Class<?>clazz =Class.forName("practice1.tgztext");
- //取得本类的全部属性
- Field[] fields=clazz.getDeclaredFields();
- for(int i=0;i<fields.length;i++)
- {
- //权限修饰符
- int mo=fields[i].getModifiers();
- String priv=Modifier.toString(mo);
- //属性类型
- Class<?>type=fields[i].getType();
- System.out.println(priv+" "+type.getName()+" "+fields[i].getName());
- }
- //实现的接口或父类属性
- Field []fields1=clazz.getFields();
- for(int i=0;i<fields1.length;i++)
- {
- //权限修饰符
- int mo=fields1[i].getModifiers();
- String priv=Modifier.toString(mo);
- //属性类型
- Class<?>type=fields1[i].getType();
- System.out.println(priv+" "+type.getName()+" "+fields1[i].getName());
- }
7.获取某个类的全部方法
Method[] method=clazz.getMethods();
8.通过反射机制调用某个类的方法
- Class<?>clazz =Class.forName("practice1.tgztext");
- Method[] method=clazz.getMethods();
- for(int i=0;i<method.length;i++)
- {
- Class<?>returnType=method[i].getReturnType();
- Class<?> param[]=method[i].getParameterTypes();
- int temp=method[i].getModifiers();
- System.out.print(Modifier.toString(temp)+" ");
- System.out.print(returnType.getName()+" ");
- System.out.print(method[i].getName());
- System.out.print("(");
- for(int j=0;j<param.length;j++)
- {
- System.out.print(param[j].getName()+" "+"args"+j);
- if(j<param.length-1)
- {
- System.out.print(",");
- }
- }
- Class<?>exce[]=method[i].getExceptionTypes();
- if(exce.length>0)
- {
- System.out.print(")throws ");
- for(int k=0;k<exce.length;k++)
- {
- System.out.print(exce[k].getName()+" ");
- if(k<exce.length-1)
- {
- System.out.print(",");
- }
- }
- }
- else{
- System.out.print(")");}
- System.out.println();
- }
通过反射机制调用某个类的方法
method=clazz.getMethod("reflect2", int.class,String.class);
method.invoke(clazz.newInstance(), 20,"张三");
- public static void main(String []args) throws Exception{
- Class<?>clazz=Class.forName("practice1.tgztext");
- Method method=clazz.getMethod("reflect1");
- method.invoke(clazz.newInstance());
- method=clazz.getMethod("reflect2", int.class,String.class);
- method.invoke(clazz.newInstance(), ,"张三");
- }
- public void reflect1()
- {
- System.out.println("a");
- }
- public void reflect2(int age,String name)
- {
- System.out.println(age+name);
- }
java 反射机制的更多相关文章
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
- Java反射机制专题
·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...
- java反射机制深入详解
java反射机制深入详解 转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...
- Java反射机制DOME
Java反射机制 public class TestHibernate { @Test public void TestHb(){ try { Class cs = Class.forName(&qu ...
- 反射——Java反射机制
反射概述 什么是反射? ① 反射的概念是由Smith在1982年首次提出的,主要指程序可以访问.检测和修改它本身状态或行为的一种能力. ② JAVA反射机制是在运行状态中,对应任意一个类,都能 ...
- Java反射机制可以动态修改实例中final修饰的成员变量吗?
问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...
- Java反射机制学习与研究
Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...
随机推荐
- iOS 多快好省的宏定义
http://my.oschina.net/yongbin45/blog/150149 // 字符串:#ifndef nilToEmpty#define nilToEmpty(object) (obj ...
- 中间人攻击(MITM)姿势总结
相关学习资料 http://www.cnblogs.com/LittleHann/p/3733469.html http://www.cnblogs.com/LittleHann/p/3738141. ...
- C#中UnixTime和DateTime的转换(转载)
由于在API请求中返回回来的时间格式为UNIX形式,需要转换成正常的显示方式,在网上找到了这么一个例子. 使用是在C#中使用的,所以WP8开发应该也可以. 转载源地址:http://blog.linu ...
- tornado 学习笔记10 Web应用中模板(Template)的工作流程分析
第8,9节中,我们分析Tornado模板系统的语法.使用以及源代码中涉及到的相关类,而且对相关的源代码进行了分析.那么,在一个真正的Web应用程序中,模板到底是怎样使用?怎样被渲染? ...
- python语句
print语句 print函数中使用逗号输出多个表达式,打印的结果之间使用空格隔开. >>> ') name: zyj age: 24 >>> print(1,2, ...
- ZeroMQ接口函数之 :zmq_getsockopt – 获取ZMQ socket的属性
ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html 本文地址 :http://www.cnblogs.com/fengbo ...
- 一些关于Viewport与device-width的东西~
进行移动web开发已经有一年多的时间了,期间遇到了一些令人很困惑的东西.比如: 我们经常使用的<meta name="viewport" content="widt ...
- css3新特性
1.css3选择器 我们所定义的 CSS 属性之所以能应用到相应的节点上,就是因为 CSS 选择器模式.参考下述代码: Body > .mainTabContainer div > s ...
- Ubuntu14.04安装wineqq国际版
一开始,我在Ubuntu14.04下安装的QQ版本是WineQQ2013SP6-20140102-Longene, 但后来发现这个版本QQ在linux下问题很多,比如不能用键盘输入密码,QQ表情 ...
- C指针-数组和指针的归一
int bArr[] = {1,2,3}; int *iarr = bArr; *iarr = 6; printf("%d\n",*iarr); printf("%d\n ...