Java笔记-反射机制Reflection API(java动态机制)基础
2017-11-01 23:19
423 查看
原则上java不是动态语言的范畴,比如python PHP。但是反射机制的出现使得java在一定意义上实现了动态语言的特征的。通过反射机制的API可以动态的获取运行时的类的内部信息或者类的结构信息。并且能够操作类的实例的对象和方法。
Java反射机制提供如下的功能:
1.在运行时判断任意一个对象的所属的类。
2.在运行时创建任何一个类的对象实例。
3.运行时获取任意一个类的所有的属性和方法(包括私有属性和方法)。
4在运行时调用和操作任意类的属性和方法。
下面是我的运行demo:
首先新建一个person类
后面是
反射测试代码:
以上就是反射机制的最基本问题,后面的很多操作都基于这一思想的实现。在上面的例子中需要注意反射机制对类私有属性和方法的操作。这与面向对象所学的封装性有一点出入。
Java反射机制提供如下的功能:
1.在运行时判断任意一个对象的所属的类。
2.在运行时创建任何一个类的对象实例。
3.运行时获取任意一个类的所有的属性和方法(包括私有属性和方法)。
4在运行时调用和操作任意类的属性和方法。
下面是我的运行demo:
首先新建一个person类
package TestReflection; /** * @author 善水 E mail:wangyweb@163.com * @version 创建时间:Nov 1, 2017 10:14:50 PM * 类说明 */ public class Person { public String name = "王云"; public int age = 22; private String sex = "男士"; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Person(String name, int age, String sex) { super(); this.name = name; this.age = age; this.sex = sex; } public Person() { super(); // TODO Auto-generated constructor stub } public void show() { System.out.println("我叫"+name+",我是一个"+sex+",今年"+age+"岁 了."); } public void display() { System.out.println("我是一个人!"); } public void display1(String nation) { System.out.println("我是一个"+nation+"人"); } }
后面是
反射测试代码:
package TestReflection; /** * @author 善水 E mail:wangyweb@163.com * @version 创建时间:Nov 1, 2017 10:18:12 PM * 类说明 */ import java.lang.reflect.Field; import java.lang.reflect.Method; import org.junit.Test; public class TestRelf { // 在不使用反射机制之前的面向对象的基本类操作 @Test public void test1(){ Person p1 = new Person(); p1.setName("刘德华"); p1.setAge(45); p1.setSex("男士"); p1.display(); p1.show(); } // 使用java的反射机制实现对运行时类的操作 @Test public void test2() throws Exception { Class<Person> pClass = Person.class; // 创建类的实例 Person person = pClass.newInstance(); // 获取属性 Field fname = pClass.getField("name"); fname.set(person, "周星驰"); Field fage = pClass.getField("age"); fage.set(person, 55); Method method1 = pClass.getMethod("display1", String.class); method1.invoke(person, "HK"); Method method2 = pClass.getMethod("setName", String.class); method2.invoke(person, "张学友"); // 重点:与封装性的原则对立,private的属性获取 // // Field fsex = pClass.getField("sex");错误:因为声明 的是私有变量 // fsex.set(person, "nanshi"); // 以下的就会运行成功 Field fsex = pClass.getDeclaredField("sex"); fsex.setAccessible(true); fsex.set(person, "女士"); person.show(); // person.display(); } }
以上就是反射机制的最基本问题,后面的很多操作都基于这一思想的实现。在上面的例子中需要注意反射机制对类私有属性和方法的操作。这与面向对象所学的封装性有一点出入。
相关文章推荐
- 安卓开发之java基础笔记11反射机制、枚举
- Java学习笔记:反射与代理机制(静态、动态)
- java笔记--反射机制之基础总结与详解
- Java基础复习笔记系列 十三 反射机制
- Java基础笔记 – 通过反射机制修改类中的私有属性的值
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- 15. JAVA 反射机制 Part 2(动态代理、类的生命周期、工厂设计模式) ----- 学习笔记
- java学习笔记13--反射机制与动态代理
- Java的反射机制与动态代理学习笔记
- java基础学习笔记——反射机制
- java学习笔记---类型信息(type information)、反射机制与动态代理
- java基础学习——反射机制与动态代理
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- JAVA基础--JAVA中的反射机制详解
- 黑马程序员学习笔记之八(Java 反射机制)
- 23-java基础加强(反射、泛型、注解、动态代理)
- 【转】java的反射机制中的动态代理代理(二)--在远程方法调用中运用代理类
- Java 反射机制-学习笔记
- JAVA基础--JAVA中的反射机制详解
- JAVA基础--JAVA中的反射机制详解