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 ...
随机推荐
- LINQ绑定List到GridView
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- HDU5942 : Just a Math Problem
\[\begin{eqnarray*}ans&=&\sum_{i=1}^ng(i)\\&=&\sum_{i=1}^n\sum_{d|i}\mu^2(d)\\&= ...
- Python for Infomatics 第13章 网页服务一(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 一旦利用程序通过HTTP协议获得 ...
- CSS居中布局总结【转】
居中布局 <div class="parent"> <div class="child">demo</div> </d ...
- ZeroMQ接口函数之 :zmq_recvmsg – 从一个socket上接收一个消息帧
ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq-recvmsg zmq_recvmsg(3) ØMQ Manual - ØMQ/4.1.0 Nam ...
- 设计模式-1-概要(c#版)
最近又重新看了几本设计模式的书籍和文章,现在再看时又有了新的感悟,而这些书籍和文章都是从需求和业务场景讲什么业务可以用什么模式,要不就是纯理论不好理解,其实我们也要理解和佩服这些概括理论的大牛,必须让 ...
- IOS网络第三天 - 01-网络文件下载(0922略)
01 数据的安全01 - 密码加密 02 数据的安全02 - 加密过程 01 -数据的安全01 - 本地存储和代码安全 04-网络状态监控 05-真机演示 06-小文件下载 07-大文件下载01-基本 ...
- ASP.NET State Server 服务 sessionState
在发布ASP.NET网站的时候,出现state server错误:Server Error in '/' Application.----------------------------------- ...
- Onethink1.1 钩子和插件的使用!
Onethink下载请自行百度咯,安装也就几秒钟. 高手(略),只是针对和我一样需要了解的菜鸟. 主要讲一讲onethink插件的使用,因为这对我们的快速开发有帮助,所以记录一下,同时也希望能够帮助一 ...
- vert.x学习(二),使用Router来定义用户访问路径
这里需要用到vertx-web依赖了,依然是在pom.xml里面导入 <?xml version="1.0" encoding="UTF-8"?> ...