`
杨杨和花花
  • 浏览: 22447 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java里的反射机制

阅读更多

     作为一个java初学者,想了解java里的反射机制。我觉得首先应该能区分静态编译和动态编译。

 一.静态编译和动态编译

     通俗讲,静态编译:在编译时确定类型,绑定对象,即通过。
     动态编译:运行时(RunningTime)确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了  

     多态的应用,有以降低类之间的藕合性,即Class.forName(“ClassName”)应用。

package ref;
import java.awt.Color;

//定义一个鸟类接口
public interface Bird {
	 String name="猫头鹰";
	 int age=2;
	 Color color=Color.black;
   public void PlayRole();
   public void Fly(int flymile);
   
}
package ref;
import java.awt.Color;

public class MaoBird implements Bird{
      public void PlayRole(){
    	  System.out.println("这只鸟的名字为"+name+",他的年龄为"+age+",它的颜色为"+color);
      }
      public void Fly(int flymile){
    	  System.out.println("它飞了"+flymile+"米");
      }
}
package ref;
import java.lang.reflect.Constructor;
/**
 * 这里类的创建通过java反射机制来实现
 * @author Administrator
 *
 */
public class RunMain1 {
    public static void main(String args[]){
    	try {
	            Class c=Class.forName("ref.MaoBird");
		    Object brid=c.newInstance();
		    MaoBird maobird=(MaoBird)brid;
		    maobird.PlayRole();
                    maobird.Fly(3);			
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
}
/**
 *这里是我们常说的静态创建类对象
 */
public class RunMain2{
      public static void main(String args[]){
                 MaoBird  maobird=new MaBird();
                 maobird.PlayRole();
                 maobird.Fly(3);
      }
}

   上面的RunMain2一开始通过类名NEW一个对象,然后在对象上调用其方法.而第一个RunMain1中,则是先获取类名,通过构造器创建对象。二者的区别,用文字还是很难说的准确。需要自己慢慢体会吧!

二.通过反射动态获得

    如果说我知道一个东西,却不知道它是用来干嘛的。这是不是显得对于东西我们认识的不够透彻?

   1:提取属性详细信息:

   

private static void printFiledInfo( java.lang.reflect.Field[] fields){
System.out.println("共有属性: "+fields.length);
for(java.lang.reflect.Field f : fields){
String fName=f.getName();
System.out.println("属性名字是: "+fName);
Class fType= f.getType();
System.out.println("属性类型是: "+fType);
//得到属性的访问限定符
int mType= f.getModifiers();
//判断是何种限定符
if (java.lang.reflect.Modifier.isPublic(mType))
System.out.println(" public");
if (java.lang.reflect.Modifier.isAbstract(mType))
System.out.println(" abstract");
if (java.lang.reflect.Modifier.isFinal(mType))
System.out.println(" final");
}
}

   2取得超类/接口详细信息

 

private static void printInterface( Class[] interfaces){
for(Class c : interfaces){
System.out.println("接口名: "+c.getName());
Class[] cs=c.getInterfaces();
printInterface(cs);
}
}
//输出所有父类名字
private static void printSuper( Class superClass){
System.out.println("接口名: "+superClass.getName());
Class ss=superClass.getSuperclass();
if(null!=ss){
printSuper(ss);
}
}

 

    3提取方法/构造器详细信息

   

//打印方法信息
private static void printMethodInfo( java.lang.reflect.Method[] methods){
for(java.lang.reflect.Method m : methods){
int t= m.getModifiers();
System.out.println("限定符是: "+t);
String name= m.getName();
System.out.println("方法名是: "+name);
Class returnType = m.getReturnType();
System.out.println("返回值类型是: "+returnType.getName());
//参数类型组....
Class ps[]= m.getParameterTypes();
//异常类型组...
Class es[]= m.getExceptionTypes();
}
}
//打印构造器信息
private static void printConstructorInfo(java.lang.reflect.Constructor[] cons){
for(java.lang.reflect.Constructor con : cons){
//构造器限定符
int m= con.getModifiers();
//得到参数类型表 . . .
Class[] ptype=con.getParameterTypes();
}
}

    以上只是它的一部分作用,想知道可以看javaAPI文档中java.lang.reflect类的方法。

三.关于在对象上调用方法和对象调用方法的区别

    其实我觉得这个问题是很纠结的,因为从字面看二者,是没有什么区别。从代码看,二者的区别就是显示

    出来。前者一开始通过已知的方法名和参数动态获得一个方法对象,然后通过这个对象调用方法。

    后者是通过类名创建对象,在对象调用方法。

    好吧,我觉得大家看完后,肯定还是很难区别。那以后敲代码慢慢体会了。

  

分享到:
评论

相关推荐

    java反射机制.zip

    java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...

    java面试题--反射机制

    ### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射机制相关的题目。这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射...

    java的反射机制及其实际应用

    ### Java的反射机制及其实际应用 #### 一、引言 ...总之,Java反射机制是一项强大的工具,它能够在运行时动态地获取和操作类的信息。然而,应该谨慎使用反射,避免滥用造成不必要的性能损失或安全风险。

    Java反射机制 Java反射机制

    ### Java反射机制详解 #### 一、Java反射机制概述 Java反射机制是Java语言的一个重要特性,它允许程序在运行时获取类的信息并操作对象。Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用...

    JAVA的反射机制与动态代理

    Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...

    Java中的反射机制

    Java反射机制允许运行中的程序检查自身,并能直接操作程序的内部属性。这是其他许多编程语言(如Pascal、C或C++)不具备的能力。 **1.1 Reflection的工作机制** 为了展示反射如何工作,我们来看一个简单的例子: ...

    Java 1.5 反射机制

    Java 1.5引入的反射机制是其动态性的一个重要体现,它允许程序在运行时检查和操作类、接口、对象及其方法。反射为开发者提供了强大的能力,可以在不知道具体类名的情况下实例化对象,调用方法,访问字段,以及处理...

    JAVA反射机制应用

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

    java反射机制源码

    java反射机制源码java反射机制源码java反射机制源码

    JAVA的反射机制与动态代理.pdf

    #### 一、JAVA反射机制概述 JAVA的反射机制是一种强大的功能,允许程序在运行时获取类的信息并操作类的对象。这种能力在很多情况下非常有用,比如在进行代码框架设计时,我们经常需要在运行时根据不同的条件选择...

    java反射机制详解

    ### Java反射机制详解 #### 一、反射机制是什么 反射机制是Java编程语言的一个核心特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象和调用对象的方法。简单来说,反射机制使得Java程序可以...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    Java反射机制总结

    ### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...

    Java反射机制

    ### Java反射机制详解 #### 一、什么是Java的反射机制 Java反射机制是Java语言的一种重要特性,使得Java成为了一种动态性很强的语言。通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法...

    java 反射机制详解

    Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    利用java反射机制的建议计算器源码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的动态性和灵活性。在这个“利用java反射机制的建议计算器源码”中...

    java反射机制demo

    给同事写的反射机制的用法,非常简单易用,大家一看就懂。也便于初学者对反射机制的理解 资源免费提供大家下载,如有疑问,可以直接咨询我

Global site tag (gtag.js) - Google Analytics