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 ...
随机推荐
- 【Unity3d游戏开发】Unity3D中的3D数学基础---向量
向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...
- java单例模式的几种写法比较
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- centos使用yum安装软件的时候出现了undefined symbol: CRYPTO_set_locking_callback
1.问题 在CentOS下使用yum安装软件,结果出现了下面的错误提示: # yum installThere was a problem importing one of the Python mo ...
- osg 示例程序解析之osgdelaunay
osg 示例程序解析之osgdelaunay 转自:http://lzchenheng.blog.163.com/blog/static/838335362010821103038928/ 本示例程序 ...
- [canvas]利用canvas绘制自适应的折线图
前段时间学习了用canvas绘制折现图,且当画布变换大小,折现图会随之变化,现附上代码 <!DOCTYPE html> <html lang="en"> & ...
- memcache 笔记
在windows下安装memecache,进入到安装目录,执行帮助命令可以查看到相关帮助 启动memcache,相关命令如上,比如-p就是端口号,memcache默认端口号是11211 语法:增加ad ...
- 错误Batch update returned unexpected row count from update [0]; actual row count: 0;
参考:http://blog.csdn.net/ssyan/article/details/7471343 也是出现类似问题,在前台页面的隐藏域中判断id是否为null,而没有去判断是否为空字符串. ...
- 2016年终分析(传统开发与网络时代的Java开发)
2016重大事件:(在此将2016年的开发称为传统开发) 1.乌镇互联网大会大会(大数据&云计算) 2.某东struts2安全漏洞 3.作为一个程序呀对于淘宝双11和双12的分析应该是最好的案 ...
- [dpdk] 熟悉SDK与初步使用 (一)(qemu搭建实验环境)
搭建实验环境: troubleshoot 第一步加载驱动 第二步切换驱动 使用了所有qemu支持的卡 [tong@T7:~/VM/dpdk] % cat start.sh sudo qemu-syst ...
- Linux 基础命令-CURL 表单上传文件
CURL -F, --form <name=content> (HTTP) This lets curl emulate a filled-in form in which a user ...