巩固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 ...
随机推荐
- HBase replication
Hbase Replication 介绍 现状 Hbase 的replication目前在业界使用并不多见,原因有很多方面,比如说HDFS目前已经有多份备份在某种程度上帮助HBASE底层数据的安全性, ...
- 【38】java的集合框架(容器框架)
Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些 Collection允许相同的元 ...
- StickyListHeaders的使用
我们知道在ios中字母的导航有悬停的效果,在android中,git上有大神实现了这种悬停的功能,我们只要将普通的Listview改为StickyListHeadersListView然后设置adap ...
- PHP-MVC和Smarty初探笔记
在慕课网上学习了PHP的MVC的基础知识,记录一下笔记: 等待更新~
- rails中select不能响应多选的解决办法
在rails4.2中如果你写如下代码,post的select无法传回多选内容,即使你select设置为多选: <select id='id_size' name='name_size' mult ...
- Mac OS X 简单的方法知道何时来电了
最近本猫所在的小区时常停电,往往半夜或是凌晨才来电啊!早上起来本猫在想如何知道确切的来电时间,但又不费事的方法呢. 方法一是用手机录音器录音,因为来电后门禁会发出"滴"的一声,所以 ...
- C# 合并多种格式文件为PDF
文档合并是一种高效文档处理方式.如果能够有一个方法能将多种不同类型的文档合并成一种文档格式,那么在文档存储管理上将为我们提供极大的便利.因此,本篇文章介绍了一种如何使用免费组件Free Spire.O ...
- MOOS学习笔记1——HelloWorld
MOOS学习笔记1--HelloWorld 例程 /* * @功能:通讯客户端的最简单程序,向MOOSDB发送名为"Greeting" * 数据"Hello", ...
- 分割url
$(document).ready(function () { var spurl = document.location.toString().split("/"); //把ur ...
- 《转》优化UITableViewCell高度计算的那些事
我是前言 这篇文章是我和我们团队最近对 UITableViewCell 利用 AutoLayout 自动高度计算和 UITableView 滑动优化的一个总结.我们也在维护一个开源的扩展,UITabl ...