java反射机制的进一步理解
承上一篇。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
java反射机制的存在让你只要知道类名就能生成这个类的实例。如果这么说的话,那岂不是违反了java做为面向对象语言的封装性,而且更恐怖的是你还可以得到这个类的属性(public)。但是其实反射机制的存在并不破坏封装新,它虽然可以生成任何类的实例,但是在当前你所在的类,如果想要生成某个类,这个类必须是当前类可见的,那么这个类必须是当前类的成员之一;它虽然能得到属性的值但所得的属性值本身就是public,所以不能说是破坏了封装性。
例子:
public class WTAimObject {
public String name = "Jobs";
public String getName(){
return name;
}
}
public class WTGetField {
public static Object getProperty(Object owner, String fieldName) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
Class ownerClass = owner.getClass();
Field field = ownerClass.getField(fieldName);
System.out.println(field.toString());
System.out.println(field.getName());
Object property = field.get(owner);
return property;
}
public static void main(String args[]) throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException{
WTAimObject aimObject = new WTAimObject();
System.out.println(WTGetField.getProperty(aimObject, "name").toString());
}
}
这个输出结果就是
public java.lang.String WTAimObject.name
name
Jobs
所以课件字段的意思:包含属性名,属性所属类,属性的public,private等;这里注意:如果这个属性是private在field.get(owner)时,会报错,但在field.name()不会。即不能通过field.get(owner);生成实例并获得值。
另一个需要注意的是:执行某个对象的方法,这也是动态代理能实现的基础!
这有一个超级好的例子我就直接搬来啦:
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName,argsClass);
return method.invoke(owner, args);
}
Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。
5~9行:配置参数的Class数组,作为寻找Method的条件。
Method method = ownerClass.getMethod(methodName, argsClass):通过methodName和参数的argsClass(方法中的参数类型集合)数组得到要执行的Method。
method.invoke(owner, args):执行该Method.invoke方法的参数是执行这个方法的对象owner,和参数数组args,可以这么理解:owner对象中带有参数args的method方法。返回值是Object,也既是该方法的返回值。
这个当中我们可以发现,当我们处理到一个类的定义时,所有的操作都是对这个类的class进行的操作的,这个Class对象是由JVM在运行时创建的,不支持现实和构造,虚拟机为每个类型创建一个读一无二的Class。一般JVM遇到显示新建一个类对象,那么JVM一般会检查是否已经加载该类的Class,如果已经加载就会使用这个Class生成该类的所有对象。
参考Class类 的解释:http://lavasoft.blog.51cto.com/62575/15433/ 这个很详细 。
反射机制参考:http://azrael6619.iteye.com/blog/429797
java反射机制的进一步理解的更多相关文章
- Java反射机制的浅显理解(这篇文章还没写好,留个草稿给自己看的)
目前只是有一个大概的理解,先把自己感觉容易立即的概念放这里,等以后结合实际工作理解深刻了再来补充. 一.什么是Java反射机制?(多种定义) 1. JAVA反射机制是在运行状态中,对于任意一个类,都能 ...
- java反射机制的粗略理解
java反射机制: 涉及的对象:Class, Object, 函数:Class类:[forName(String className):static:getClass():public],Object ...
- java反射机制 + Method.invoke解释 getMethod + 反射理解
功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...
- (转)JAVA反射机制理解
JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没 ...
- JAVA反射机制及理解
JAVA反射 往往当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么,它能做什么,它比原有知识强在哪里,我们该怎么使用它.当你能够解决这些问题时,便意味着你已经对这项知识入门了. 首先: 反 ...
- 理解Java反射机制
理解Java反射机制 转载请注明出处,谢谢! 一.Java反射简介 什么是反射? Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在.灵活掌握Java反射机制,对学习框架技术有很大 ...
- Java知识总结:Java反射机制(用实例理解)
概念理解: 反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来 实现对自己行为的描述( self-representation )和检测( examination) ,并能 ...
- 详解Java反射机制
反射是程序在运行状态下,动态的获取某个类的内部信息的一种操作.例如:类名,包名,所有属性的集合,所有方法的集合,构造方法的集合等.该操作发生在程序的运行时状态,所以编译器管不着有关反射的一些代码,通常 ...
- Java反射机制剖析(一)-定义和API
1. 什么是Java反射机制 Java的反射机制是在程序运行时,能够完全知道任何一个类,及其它的属性和方法,并且能够任意调用一个对象的属性和方法.这种运行时的动态获取就是Java的反射机制.其 ...
随机推荐
- java-08多态与异常处理
1.运行以下代码: public class ParentChildTest { public static void main(String[] args) { Parent parent=new ...
- LeetCode Image Smoother
原题链接在这里:https://leetcode.com/problems/image-smoother/description/ 题目: Given a 2D integer matrix M re ...
- swing之borderlayout
import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame; //1.继承 JFrame类 ...
- SOA、微服务与服务网格
SOA架构解析 SOA 全称是: Service Oriented Architecture,中文释义为 “面向服务的架构”,它是一种设计理念,其中包含多个服务, 服务之间通过相互依赖最终提供一系列完 ...
- spark远程调试
基本流程1.远程运行spark,打开Spark master机器的JVM的jdwp,让其阻塞监听指定端口(8888),让其有终端向指定端口发送特定请求再执行:2.IntelliJ配置socket远程连 ...
- 存储过程错误异常处理例子 --> DECLARE EXIT HANDLER FOR SQLEXCEPTION (转)
刚才一个朋友问到: mysql 有类似 mssql 退出执行的方法不? 比如我执行到某个条件,下面就终止执行了. 想起以前写的存储过程,找了好久才找到,就发给他,希望对他有所帮助,贴在这里,留作 ...
- 发任务找不到test-unit报错
发任务的时候因找不到gem包test-unit报错, 出错行: require 'test/unit' require 'test/unit/testresult' 解决办法如下 1.通过命令查看ge ...
- bash姿势-没有管道符执行结果相同于管道符
听起来比较别口: 直接看代码: shell如下: [root@sevck_linux ~]# </etc/passwd grep root root:x:::root:/root:/bin/ba ...
- 重新认识synchronized(上)
synchronized在JDK5之前一直被称为重量级锁,是一个较为鸡肋的设计,而在JDK6对synchronized内在机制进行了大量显著的优化,加入了CAS,轻量级锁和偏向锁的功能,性能上已经跟R ...
- 如何将DevExpress的Gridcontrol导出到Excel
private void simpleButton1_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog = new S ...