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 ...
随机推荐
- 关于Xcode8.1 / iOS10+ 真机测试系统打印或者宏定义打印不显示问题
前言: 最近做项目时遇到了很多莫名其妙的问题,其中就有这个打印(NSLog).也不多废话了,我们先来回顾一下Xcode8发布以来,我们遇到的一些关于打印的问题,当然也有解决方法: 1.Xcode8打印 ...
- java-集合3
浏览以下内容前,请点击并阅读 声明 Queue接口(队列) 需要对一些列的元素进行处理前,我们可以把他们放到Queue对象中,除了继承Collection接口的方法外,队列还有一些插入,删除和检查操作 ...
- React的双向绑定
以前对于双向绑定概念来自于Angular.js,现在我用我感兴趣的react.js来实现这样的方式.有2种方式分析,1:不用插件,2:用插件 (引入react.js操作省略...) 不用插件: 先创建 ...
- 【原】iOS学习之应用程序的启动原理
最近看视频了解了一下应用程序的启动原理,这里就做一个博客和大家分享一下,相互讨论,如果有什么补充或不同的意见可以提出来! 1.程序入口 众所周知,一个应用程序的入口一般是一个 main 函数,iOS也 ...
- jQuery Live Query 插件
http://www.cnblogs.com/sunjing/archive/2008/12/06/1349097.html 上篇日志里写到的那个问题其实有种更简单的解决办法,就是使用jquery的L ...
- 一些用过的我常忘记的小知识(web前端)
背景图片固定:background-attachment:fixed 将图片的尺寸从中心点开始改变:backgroun-position:center background-size: ** 旋转 ...
- java调用url接口
很多简单的接口就是直接一个URl的形式, 怎么调用? HttpClient httpclient=null; PostMethod post=null; try{ httpclient = new H ...
- MVC入口程序 | 简单调用及实例化
入口程序: 现在大多采用单一入口机制,单一入口就是指在一个web应用程序中,所有的请求都指向一个脚本文件.通俗点说就是一幢大楼只有一个大门入口可以进去... 目录: 建立一个控制器/模型/视图调用函数 ...
- [Android]用图库打开指定的文件夹,没错是第一个画面直接是图库的文件夹画面
参考了这个里面的代码 http://bbs.csdn.net/topics/380084274 一直报错 06-16 23:58:50.698 26148-26161/com.example.myap ...
- android studio增量更新
一.概述 1.1 概念 增量更新即是通过比较 本机安装版本 和 想要安装版本 间的差异,产生一个差异安装包,不需要从官网下载并安装全量安装包,更不需要将本机已安装的版本下载,而仅仅只是安装此差异安装包 ...