一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,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反射机制的更多相关文章

  1. Java反射机制demo(七)—反射机制与工厂模式

    Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...

  2. 黑马程序员——【Java高新技术】——反射机制

    ---------- android培训.java培训.期待与您交流! ---------- 一.概述 1.Java反射机制:是指“在运行状态中”,对于任意一个类,都能够知道这个类中的所有属性和方法: ...

  3. java基础篇---反射机制

    一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...

  4. java进阶(41)--反射机制

    文档目录: 一.反射机制的作用 二.反射机制相关类 三.获取class的三种方式 四.通过反射实例化对象 五.通过读属性文件实例化对象 六.通过反射机制访问对象属性 七.通过反射机制调用方法 ---- ...

  5. java中的反射机制在Android开发中的用处

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

  6. Java 中的反射机制

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

  7. JAVA类型信息——反射机制

    JAVA类型信息——反射机制 一.反射机制概述 1.反射机制:就是java语言在运行时拥有的一项自我观察的能力,java通过这种能力彻底了解程序自身的情况,并为下一步的动作做准备. 2.反射机制的功能 ...

  8. 浅说Java中的反射机制(二)

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

  9. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  10. java学习之反射机制

    java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...

随机推荐

  1. Socket层实现系列 — bind()的实现(一)

    bind()函数的使用方法很简单,但是它是怎么实现的呢? 笔者从应用层出发,沿着网络协议栈,分析了bind()的系统调用.Socket层实现,以及它的TCP层实现. 本文主要内容:bind()的系统调 ...

  2. Mybatis源码之SimpleExecutor

    /** * @author Clinton Begin */ public class SimpleExecutor extends BaseExecutor { public SimpleExecu ...

  3. myBatis源码之XMLConfigBuilder

    XMLConfigBuilder是对mybatis的配置文件进行解析的类,会对myabtis解析后的信息存放在Configuration对象中,Configuration对象会贯穿整个mybatis的 ...

  4. obj-c中如何定义类的私有实例方法

    obj-c原生没有提供此项机制,不像java有private/protected/public方法的概念.obj-c中的@private以及类似的@protected和@public是用于修饰类的实例 ...

  5. Android布局优化:include 、merge、ViewStub的详细总结

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 本篇博客主要是对上篇博客的补充Android性能优化之UI渲染性能优化, 没有什么新东西,觉得应该是都掌握的玩意,写出来也只是自己做个小小的总结. ...

  6. 爬虫Scrapy框架运用----房天下二手房数据采集

    在许多电商和互联网金融的公司为了更好地服务用户,他们需要爬虫工程师对用户的行为数据进行搜集.分析和整合,为人们的行为选择提供更多的参考依据,去服务于人们的行为方式,甚至影响人们的生活方式.我们的scr ...

  7. 深入理解springMVC思想

     转载:http://elf8848.iteye.com/blog/875830 深入理解Spring MVC 思想   目录  一.前言二.spring mvc 核心类与接口三.spring mvc ...

  8. access窗体最大化到软件大小

    Private Sub Form_Load()DoCmd.ShowToolbar "Ribbon", acToolbarNo '窗体最大化,占满软件最 End Sub

  9. python做量化交易干货分享

    http://www.newsmth.NET/nForum/#!article/Python/128763 最近程序化交易很热,量化也是我很感兴趣的一块. 国内量化交易的平台有几家,我个人比较喜欢用的 ...

  10. POSTGRESQL 并发控制

    http://meidayhxp.blog.163.com/blog/static/117608156201210243837491/ 这个内容是官方Doc中的一章,具体是那一版的,还未确认. 第九章 ...