一 概念

  java反射机制属于 java动态性之一  ,指的是可以运行时加载,探知,使用编译期间完全未知的类,程序在运行状态中,可以动态的加载一个只有,

名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法和属性,典型的动态语言有

Python ruby javascript等 ,ssh框架大量的用到了反射,如果想知其意,不可不学。

       Class clazz=Class.forName("path"); -加载完类后,在堆内存中,就产生了一个class对象,(一个类只有一个class对象),这个对

像包含了类的所有的结构信息,我们可以通过这对象看到类的结构,这个对象像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称为:反射。

  初学反射可能看概念有些不能理解反射到底是干什么,相信经过初步的学习之后,再来看这些概念,会觉得原来如此,博主学习感觉一直都是这样。

二 示例

  User类

package deadLockThread;
//我们的实体类
public class User {
private String name;
private int id;
private int age; public User() {
// TODO Auto-generated constructor stub
} public User(String name, int id, int age) {
super();
this.name = name;
this.id = id;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "User [name=" + name + ", id=" + id + ", age=" + age + "]";
} }

  获取Class类 获得属性和方法的 api使用

  凡是方法名称带有 Declared  就表示可以获得私有的方法和属性

String path="deadLockThread.User";
Class clazz=Class.forName(path);//两种方法都能获得class对象,第一种具有动态性,可根据外部传来的path选择要加载的类
Class clazz1=User.class;//这里用clazz做示范; //常用方法
System.out.println("获取类的名字");
System.out.println(clazz.getName());//获取类的名字 System.out.println("获取类中的属性"); Field[] fields=clazz.getDeclaredFields();//获取类中所有的属性 clazz.getFields();//获取类中共有的属性,私有不获取 System.out.println("--------------------------------------------------------------");
//打印输出
for (Field field : fields) {
System.out.println(field);
}
System.out.println("--------------------------------------------------------------");
System.out.println("获取类中所有的方法");
Method[] methods=clazz.getDeclaredMethods();//获取类中所有的方法
Method[] methods2=clazz.getMethods();////获取类中所有的public方法
//输出所有方法
for (Method method : methods) {
System.out.println(method);
}

  Constructor 构造器的获取和使用

			Constructor c=clazz.getConstructor(String.class,int.class,int.class);//根据参数得到构造器;
User u1=(User)c.newInstance("Test1",45,78);//使用构造器创建一个User对象
Constructor[] con= clazz.getDeclaredConstructors();//得到所有的构造器
//打印所有的构造器对象
for (Constructor constructor : con) {
System.out.println(constructor);
}

  根据Class创建一个对象,并使用class中的方法进行数据操作

                     System.out.println("根据class new一个实例对象");
User user=(User)clazz.newInstance();//得到一个实例对象
user.setAge(45);//可直接使用方法 也可使用下面的方法 下面的方法更具有动态性 修改属性值
Field fi=clazz.getDeclaredField("age");//根据属性名称得到一个Field
fi.setAccessible(true);//访问检查 将参数这只为true 表示可以访问private属性 不然如果是私有的会报错
fi.set(user, 85);//第一个参数是指定操作的对象,第二个是具体参数
System.out.println(user.toString());  System.out.println("使用class的方法调用对象中的方法,更具有动态性");
             user.toString();//可以直接调用toString方法,也可以用下面的方法
    Method me= clazz.getDeclaredMethod("toString",null);//获取方法时方法名称后,要填入该方法的参数,如没有填写null
              me.setAccessible(true);//访问检查 设置为true 表示禁止检查
              me.invoke(user, null);//第一个参数是指定操作的对象,第二个是具体参数
              System.out.println(user.toString());

  

  

   

   

Java反射机制一 概念和简单的使用方法。的更多相关文章

  1. 浅谈Java反射机制 之 使用类的 属性、方法和构造函数

    前面两篇我们总结了Java反射机制如何获取类的字节码,如何获取构造函数,属性和方法, 这篇我们将进一步验证如何使用我们获取到的属性.方法以及构造函数 1.使用 反射 获取到的 属性 import ja ...

  2. JAVA反射机制基础概念

    反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠覆原来对java的理解. J ...

  3. java反射机制(访问私有字段和私有方法)

    来自:http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html 尽管我们通常认为通过JAVA的反射机制来访 ...

  4. Java 反射机制(包括组成、结构、示例说明等内容)

    第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还原“类的全部的信息”.这里“类的部分已经的信息”,可以是“类名”或“类的对象” ...

  5. Java 反射机制介绍

    参考文章:http://www.cnblogs.com/skywang12345/p/3345205.html Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还 ...

  6. [转载]Java 反射机制(包括组成、结构、示例说明等内容)

    FROM:http://www.cnblogs.com/skywang12345/p/3345205.html 第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们 ...

  7. 转!!java反射机制

    Java 反射机制 基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象 ...

  8. 浅谈Java反射机制 之 获取类的字节码文件 Class.forName("全路径名") 、getClass()、class

    另一个篇:获取 类 的 方法 和 属性(包括构造函数) 先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它 ...

  9. java反射机制(笔记)

    java反射机制就是获取出class的相应方法 例如 获取构造函数: 模版: Class test = Class.forName("cn.test.Person");//得到相应 ...

随机推荐

  1. linux系统下ipmitool添加BMC帐号密码

    需求:已知BMC帐号id2为root管理员帐号,添加id5bmc帐号 工具:ipmitool version 1.8.14 系统:CentOS release 6.6 (Final) 1,通过yum安 ...

  2. C#调用OCX控件的常用方法[转]

    小伙伴们在使用ICP提供的各种能力进行集成开发时常常会遇到一些技术上的困扰,例如ICP中很多接口是通过OCX控件的方式提供的,如何调用这些接口,就成了一个不大不小的问题,毕竟开发指南上可没这些内容啊~ ...

  3. C# Winform下一个热插拔的MIS/MRP/ERP框架12(数据处理基类)

    作为ERP等数据应用程序,数据库的处理是重中之重. 在框架中,我封装了一个数据库的基类,在每个模组启动或窗体启动过程中,实例化一个基类即可调用CRUD操作(create 添加read读取 update ...

  4. luoguP4868 Preprefix sum

    https://www.luogu.org/problemnew/show/P4868 线段树上加等差数列,基础区间修改单点查询 等差数列具有可加性,当在同一段区间内时,首项相加公差相加即可 #inc ...

  5. 【Thread】线程工厂-ThreadFactory

    ThreadFactory---线程工厂 在apollo源码中有这么一段代码 ExecutorService m_longPollingService = Executors.newSingleThr ...

  6. Unity---动画系统学习(1)---在状态机中简单控制物体运动

    1. 介绍 新建一个GameObject-Cube,在Window下添加Animation(快捷键ctrl+6).会添加用于播放动画的三个东西.物体上的Animator组件.Animator Cont ...

  7. 【BZOJ1880】[SDOI2009]Elaxia的路线 (最短路+拓扑排序)

    [SDOI2009]Elaxia的路线 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. \(El ...

  8. C语言——从入门到精通,从精通到放弃

    从第一次在CB上运行处 Hello World开始,哈哈哈哈,便开始各种幻想,哈哈哈哈,想着这就入门了,哈哈哈哈,我果然是个天才,哈哈哈哈. 后来啊,if-else语句,for 语句,while语句, ...

  9. Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:

    Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:常见问题:HTTP 错误 500.0 - Internal Server Error无法显示页面,因为发生内 ...

  10. [PowerShell]Quote in String

    今天遇到一个问题,如何在Select-String的Pattern参数里能使用双引号 比如 Select-String -path . -pattern "Lines: <span c ...