巩固java(七)-----java反射机制
一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。【这段话摘自百度百科】
java反射有这些功能:
* 在运行时判断一个对象所属的类;
* 在运行时构造任意一个类的对象;
* 在运行时判断任意一个类的成员对象和方法;
* 在运行时调用任意一个类的方法
* 生成动态代理
接下来,将通过一些实例理解java的反射机制。
根据对象获取其完整的包名和类名
abstract class Base{
}
class BaseExt extends Base{
}
public class Reflection {
public static void main(String[] args) {
BaseExt baseExt = new BaseExt();
//通过对象获得其完整的包名和类名
System.out.println("baseExt对象的运行时类的java.lang.Class对象:"+baseExt.getClass());
System.out.println("实例化出对象baseExt的类为:"+baseExt.getClass().getName());
System.out.println("实例化出对象baseExt的类的超类为:"+baseExt.getClass().getSuperclass().getName());
System.out.println("实例化出对象baseExt的类的超类的超类为:"+baseExt.getClass().getSuperclass().getSuperclass().getName());
}
}
运行结果
baseExt对象的运行时类的java.lang.Class对象:class reflection.BaseExt
实例化出对象baseExt的类为:reflection.BaseExt
实例化出对象baseExt的类的超类为:reflection.Base
实例化出对象baseExt的类的超类的超类为:java.lang.Object
归纳:
1.getClass()的作用是返回该对象的运行时类的java.lang.Class对象;
2.getSuperclass()的作用是返回对象的类的父类的java.lang.Class对象;
3.getName()的作用是根据class获取它的包名和路径;
实例化类的对象,获取类的属性和方法,调用类的方法
class Base1{
public int count;
public void say(String item){
System.out.println("我是Base1类,"+item);
}
public void tell(){
System.out.println("我是不会告诉你我是Base1的");
}
}
class Base2{
public String name;
public void say(String item){
System.out.println("我是Base2类,"+item);
}
public void tell(){
System.out.println("我是不会告诉你我是Base2的");
}
}
class Info{
public void getInfo(Object obj){
//获取obj对象的类名
String className = obj.getClass().getName();
try {
//实例化一个类className的对象
Class<?> base = Class.forName(className);
//获得该类的所有属性
Field[] fields = base.getDeclaredFields();
System.out.println("fields:");
for(Field field:fields){
//访问修饰符
int mo = field.getModifiers();
String modifier = Modifier.toString(mo);
//属性类型
String type = field.getType().getName();
//属性名
String name = field.getName();
System.out.println(" "+modifier + " "+ type + " " +name);
}
//获得该类的所有方法
Method[] methods = base.getMethods();
System.out.println("methods:");
for(Method method:methods){
//访问修饰符
int mmo = method.getModifiers();
String mmodifier = Modifier.toString(mmo);
//返回类型
String mtype = method.getReturnType().getName();
//属性名
String mname = method.getName();
System.out.println(" "+mmodifier + " "+ mtype + " " +mname);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public void say(Object obj,String item){
//获取obj对象的类名
String className = obj.getClass().getName();
try{
//实例化一个类className的对象
Class<?> base = Class.forName(className);
//调用base对象所属类的say方法
Method method = base.getMethod("say",String.class);
method.invoke(base.newInstance(),item);
//调用base对象所属类的tell方法
Method method2 = base.getMethod("tell");
method2.invoke(base.newInstance());
}catch(Exception e){
e.printStackTrace();
}
}
}
public class Reflection {
public static void main(String[] args) {
Info info = new Info();
info.getInfo(new Base1());
System.out.println("-------------------------");
info.getInfo(new Base2());
System.out.println("-------------------------");
info.say(new Base1(),"你是谁?");
System.out.println("-------------------------");
info.say(new Base2(),"你是谁?");
}
}
运行结果:
fields:
public int count
methods:
public void say
public void tell
public final void wait
public final void wait
public final native void wait
public boolean equals
public java.lang.String toString
public native int hashCode
public final native java.lang.Class getClass
public final native void notify
public final native void notifyAll
-------------------------
fields:
public java.lang.String name
methods:
public void say
public void tell
public final void wait
public final void wait
public final native void wait
public boolean equals
public java.lang.String toString
public native int hashCode
public final native java.lang.Class getClass
public final native void notify
public final native void notifyAll
-------------------------
我是Base1类,你是谁?
我是不会告诉你我是Base1的
-------------------------
我是Base2类,你是谁?
我是不会告诉你我是Base2的
归纳:
4.Class<?> base = Class.forName(className) 通过调用Class.forName()实例化一个类的对象;
5.getDeclaredFields()获取该类的属性,getMethods()获取该类的方法,getModifiers获取属性和方法的访问修饰符等;
6.通过Info类中say方法的写法调用类的方法,getMethod方法的第一个参数为方法名,后面是参数类型,无参方法只写方法名即可,invoke方法从第二个参数开始为被调用方法的参数
另外通过阅读java API我们还可以获取到其他的一些方法,比如获取构造方法,获取方法参数等等。
好了,反射暂时先写到这里。
版权声明:本文为博主原创文章,未经博主允许不得转载。
巩固java(七)-----java反射机制的更多相关文章
- Java反射机制demo(七)—反射机制与工厂模式
Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...
- 黑马程序员——【Java高新技术】——反射机制
---------- android培训.java培训.期待与您交流! ---------- 一.概述 1.Java反射机制:是指“在运行状态中”,对于任意一个类,都能够知道这个类中的所有属性和方法: ...
- java基础篇---反射机制
一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...
- java进阶(41)--反射机制
文档目录: 一.反射机制的作用 二.反射机制相关类 三.获取class的三种方式 四.通过反射实例化对象 五.通过读属性文件实例化对象 六.通过反射机制访问对象属性 七.通过反射机制调用方法 ---- ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- Java 中的反射机制
JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ...
- JAVA类型信息——反射机制
JAVA类型信息——反射机制 一.反射机制概述 1.反射机制:就是java语言在运行时拥有的一项自我观察的能力,java通过这种能力彻底了解程序自身的情况,并为下一步的动作做准备. 2.反射机制的功能 ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- 浅说Java中的反射机制(一)
在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...
- java学习之反射机制
java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...
随机推荐
- iOS监听模式系列之本地通知Notification
本地通知 本地通知是由本地应用触发的,它是基于时间行为的一种通知形式,例如闹钟定时.待办事项提醒,又或者一个应用在一段时候后不使用通常会提示用户使用此应用等都是本地通知.创建一个本地通知通常分为以下几 ...
- Android的Context Manager(服务管理器)源码剖析-android学习之旅(99)
Context Manager介绍 Context Manager对应的进程是servicemanager进程,它先于Service Server和服务客户端运行,进入接收IPC数据的待机状态,处理来 ...
- 用Xstream时候遇到的两个小异常
第一个 com.thoughtworks.xstream.converters.ConversionException: Cannot construct ClassXXX as it does no ...
- Jedis对Redis的常用命令操作
本篇主要总结一些Jedis对Redis的常用命令操作: 1.对key操作命令 2.对String操作命令 3.对List操作命令 4.对Set操作命令 5.对Hash操作命令 6.排序操作指令 一.项 ...
- myeclipse10破解
原本一直使用eclipse,但是写起web还是不太方便,由于idea使用不太顺手不太爱用.原来一直不能破解,今天迫不得已又拿起myeclipse仔细搞一番.下面是遇到的问题的总结. 不成功原因一:.原 ...
- JS核心笔记
一.说明 JS权威指南文字用红色标出: JS高级程序设计用橙色标出; 自己加上的文字用粉红色标出: 其(一)-(九)为JS权指南,(十)为JS高级程序设计 二.记法结构 2.1字符集 Javascri ...
- 基于libevent的tcp拆包分包库
TCP/IP协议虽然方便,但是由于是基于流的传输(UDP是基于数据报的传输),无论什么项目,总少不了解决拆包分包问题. 以前的项目总是每个程序员自己写一套拆包分包逻辑,实现的方法与稳定性都不太一致.终 ...
- mac port 清理
http://popozhu.github.io/2014/10/27/mac-port-%E6%B8%85%E7%90%86/ 使用 mac port 来安装一些软件,时间久了后(也有两年多),更新 ...
- 测试驱动开发 TDD
一.详解TDD 1.1.TDD概念 :Test Drived Develop 测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种方法论.TDD的原理是在开发功能代码之前,编写单元测试用例代码,测试 ...
- 多层嵌套的json数据
很多时候我们见到的json数据都是多层嵌套的,就像下面这般: {"name":"桔子桑", "sex":"男", , & ...