JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

  

 1 package com.www.invoke;

 import java.lang.reflect.Method;

 /**
* 通过反射操作 类的方法
* java的反射 是说的是运行时 。
* 反射的总结:
* 1,每个类都有与之对用的Class对象。
* 2,每个方法都有与之对用的Method对象。
* 3,每个成员变量都有与之对用的Field对象。
* 4,第一步都是获得类对应的Class对象。
* 5,通过反射可以获得私有的成员变量和方法。
* @author Kelly.chen
*
*/
public class InvokeTest { public int add(int a, int b){
return a + b;
} public String getName(String name){
return "My name is "+name;
} public static void main(String[] args) throws Exception {
//获得类对应的的Class对象 方法一
//Class<?> classType = InvokeTest.class;
//获得类对应的Class对象 方法二
Class<?> classType = Class.forName("com.www.invoke.InvokeTest");
//获得InvokeTest 的一个对象 相当于 InvokeTest invokeTest = new InvokeTest();
Object invokeTest = classType.newInstance();
//测试是不是 InvokeTest的对象 结果是 ture
System.out.println(invokeTest instanceof InvokeTest); //获得 add() 方法
//第一个参数是方法的名字,第二个参数是Class类型的可变参数,与方法的参数对应
Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class}); System.out.println(addMethod.getName());
//调用方法
//第一个参数是那个对象的方法,第二个参数是Object类型的可变参数,与方法参数对应
Object object = addMethod.invoke(invokeTest, new Object[]{2, 3}); System.out.println(object); //获得getName()方法
Method getNameMethod = classType.getMethod("getName", new Class[]{String.class});
//调用getName()方法
Object objectName = getNameMethod.invoke(invokeTest, new Object[]{"chenlei"});
System.out.println(objectName);
//得到所有public 方法(包括继承父类的方法)
Method[] methods = classType.getMethods();
for (Method method : methods) {
System.out.println(method.getName());//获得方法的名字
}
}
}

获得私有方法和成员变量

 package com.www.invoke;

 import java.lang.reflect.Field;
import java.lang.reflect.Method; public class PrivateTest { private String address="shanghai"; public int age = 20; protected String school = "北京大学"; private String sayHello(String name){ return "Hello :"+name;
}
public static void main(String[] args) throws Exception { Class<?> classType = PrivateTest.class;
PrivateTest privateTest = (PrivateTest) classType.newInstance();
//可以获得私有的方法,第一个参数是方法的名字,第二个参数是Class类型的可变参数,与方法的参数类型对应
Method method = classType.getDeclaredMethod("sayHello", new Class[] { String.class });
//true不再进行访问权限检查,之后就可以访问此私有方法了,false与之相反
method.setAccessible(true);
//调用方法
Object object = method.invoke(privateTest, new Object[] { "chenlei" });
System.out.println(object);
/* -----------------------------调用 成员变量-----------------------*/
//只能获得public 修饰的方法的成员变量
Field ageField = classType.getField("age");
//获得变量的值
int age = ageField.getInt(privateTest);
System.out.println(age);
Field addressField = classType.getDeclaredField("address");
//true不再进行访问权限检查,之后就可以访问此私有变量了
addressField.setAccessible(true);
//获得变量的值
String address = (String) addressField.get(privateTest);
System.out.println(address);
//获得所有public修饰的成员变量
Field[] fields = classType.getFields();
for (Field field : fields) {
System.out.println(field);
}
}
}

总结:

java的反射 是说的是运行时 。
反射的总结:
1,每个类都有与之对用的Class对象。
2,每个方法都有与之对用的Method对象。
3,每个成员变量都有与之对用的Field对象。
4,第一步都是获得类对应的Class对象。
5,通过反射可以获得私有的成员变量和方法。

  

java的反射的更多相关文章

  1. JAVA的反射理解

    1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...

  2. iOS运行时编程(Runtime Programming)和Java的反射机制对比

    运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下:   1.相同点   都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...

  3. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  4. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  5. Java:反射

    初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...

  6. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  7. java笔记--反射进阶之总结与详解

    一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...

  8. java笔记--反射机制之基础总结与详解

    一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...

  9. Java中反射的三种常用方式

    Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...

随机推荐

  1. Autofac 组件、服务、自动装配 《第二篇》

    一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...

  2. c# 九九乘法表

    static void Main(string[] args) { ; i < ; i++) { ; s <= i; s++) { Console.Write(s + "*&qu ...

  3. 成就PHP高手的五个必由之路

    亲们,此文时转载过来的,不是原创!特此说明一下 原文名称:5 ways to be a better php developer原文链接:http://www.developertutorials.c ...

  4. spring+mybatis多数据源动态切换

    spring mvc+mybatis+多数据源切换 选取oracle,mysql作为例子切换数据源.oracle为默认数据源,在测试的action中,进行mysql和oracle的动态切换. web. ...

  5. Java三大框架之——Hibernate中的三种数据持久状态和缓存机制

    Hibernate中的三种状态   瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...

  6. datatables中的Options总结(2)

    datatables中的Options总结(2) 五.datatable,列 columnDefs.targets 分配一个或多个列的列定义. columnDefs 设置列定义初始化属性. colum ...

  7. 灵活的JavaScript(一)

    自己对JavaScript的原型,继承,闭包,多少也还是了解些,但是平时写的东西都挺简单的,也用不上,所以感觉提升不大.于是乎买了一本<JavaScript设计模式>来提高下自己,这本是百 ...

  8. 深入理解DOM节点类型第六篇——特性节点Attribute

    × 目录 [1]特征 [2]属性 [3]方法 前面的话 元素的特性在DOM中以Attr类型表示,从技术角度讲,特性是存在于元素的attributes属性中的节点.尽管特性是节点,但却不是DOM节点树的 ...

  9. Java输入输出常用类Scanner

    Scaner类,使用获取键盘输入. public boolean DemoTest(){ Scanner input = new Scanner(System.in); System.out.prin ...

  10. InfoPath错误,此文档库已被重命名或删除

    在使用InfoPath发布表单,发布到SharePoint服务器报错,如下介绍: 环境:Windows 2012 DateCenter + Sql 2012 + SharePoint 2013 + O ...