`
swingline
  • 浏览: 19271 次
  • 来自: ...
社区版块
存档分类
最新评论

Java学习:反射(一)

阅读更多
动态语言:程序运行时,允许改变程序结构或变量类型的语言。从这点来说,Perl、Python、Ruby是动态语言,C++、Java、C#不是动态语言。

JAVA反射:运行时加载、探知、使用编译期间完全未知的classes,即Java程序可以加载一个运行时才得知名称的 Class,获悉其完整构造(但不包括Methods定义),并生成其对象实体、或对其Fields设值、或唤起其Methods。

主要元素
Class:类名对应类对象
Field:类或接口中定义的所有可访问的公共字段(可理解为公共成员变量)
Modifier:类或接口的修饰符(如public、protected、private、final、static、abstract、interface)
Method:类或接口中定义的方法
Package:该类所在的包

例子
(1) 定义一个类Man,成员变量有public、protected、private类型
public class Man implements Person {
	private String m_name;
	protected String m_nickName;
	public String m_chineseName;
        public Man(String name) {
               this.m_name = name;
        }
	
	public String getName() {
		return this.m_name;
	}
	public void setName(String name) {
		this.m_name = name;
	}
}


(2) Main方法
public static void main(String[] args) {
	// TODO Auto-generated method stub
	try {
               //获取类对象
		Class clazz = Class.forName("com.reflect.example.Man");
                //类中的方法
		System.out.println("Methods:");
		Method[] methods = clazz.getMethods();
		for (int i = 0; i < methods.length; i++) {
			System.out.println("    " + methods[i].toString());
		}

                //类中的字段
		System.out.println("Fields:");
		Field[] fileds = clazz.getFields();
		for (int i = 0; i < fileds.length; i++) {
			System.out.println("    " + fileds[i].toString());
		}

                //类中的修饰符
		System.out.println("Modifiers:" + clazz.getModifiers());
	} catch (Exception e) {
		// TODO: handle exception
	}
}


(3)输出
Methods:
    public java.lang.String com.reflect.example.Man.getName()
    public void com.reflect.example.Man.setName(java.lang.String)
    public native int java.lang.Object.hashCode()
    public final native java.lang.Class java.lang.Object.getClass()
    public final void java.lang.Object.wait() throws java.lang.InterruptedException
    public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
    public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
    public boolean java.lang.Object.equals(java.lang.Object)
    public final native void java.lang.Object.notify()
    public final native void java.lang.Object.notifyAll()
    public java.lang.String java.lang.Object.toString()
Fields:
    public java.lang.String com.reflect.example.Man.m_chineseName
Modifiers:1

(4)小结
--Class::getMethods()得到的是该类的所有方法(包括从父类继承下来的),需要得到某一个方法可以使用Class::getMethod(String name, Class... parameterTypes)
--Class::getFields()得到的是public类型的字段,得不到protected、private类型的,但可以使用Class::getDeclaredFields() 来得到所有类型的,或者使用Class::getDeclaredField(String name) 来取得某个方法
--Class::getModifiers()得到类定义的类型:public(1)、private(2)、protected(4)、static(8)、interface(512)等,以int型数表示


构造函数
String className = "com.reflect.example.Man";
//类对象.
Class clazz = Class.forName(className);
//获得名字为className的构造对象,构造函数有参数时,把参数的类数组作
//为getConstructor的参数
Constructor constructor = clazz.getConstructor(new Class[]{String.class});
//通过构造对象获得名字为className的实例.
Person person = (Person)constructor.newInstance(new Object[]{"Jack"});

唤起Method
(1) 调用:person.setName();
(2) 使用Method的invoke方式
    Method method = clazz.getMethod("setName", new Class[]{String.class});
    //要调用方法的对象person作为第一个参数,而要传递给所要调用方法的参数集作为第二个参数
    method.invoke(person, new Object[]{"Joke"});
    方式(1)、(2)实现同样的功能。但方式(2)能够在运行期间唤起所需要调用的方法,使得动态调用方法更灵活,在一些优秀的框架和动态代理中常常使用这种方式。
分享到:
评论

相关推荐

    java注解和反射的个人学习笔记

    java注解和反射的个人学习笔记

    Java反射机制的使用和学习方法

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。这一机制对于理解和实现高级框架、动态代理、元数据处理等场景至关重要。以下是对Java反射机制的详细说明:...

    Java反射机制学习(二)

    在Java编程语言中,反射机制是一项强大的工具,它允许程序在运行时检查并操作类、接口、字段和方法的信息。这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象...

    java学习——java中的反射学习笔记.rar_java 反射

    Java反射是Java编程语言中的一种强大机制,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射是通过java.lang.Class类和java.lang.reflect包中的类来实现的。本篇笔记将深入探讨...

    Java反射经典实例

    Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。...学习和熟练掌握Java反射,能够显著提升编程的灵活性和解决问题的能力。

    java面试题--反射机制

    通过本文的学习,我们深入了解了Java反射机制的基本概念、原理以及应用。Java反射机制为Java程序提供了一种强大的动态处理能力,使得Java不仅仅局限于静态类型语言的功能限制。掌握Java反射机制对于开发者来说是非常...

    Javafanshe.rar_java 反射_java反射_反射_反射机制

    Java反射是Java编程语言中的一个重要特性,它允许运行时的Java程序访问并操作类、接口、字段和方法等对象的内部信息,即使这些信息在编译时并不知道。这一机制使得Java具有了高度的动态性,能够实现元编程,即在程序...

    Java反射学习.pdf

    Java 反射学习 Java 反射是 Java 程序设计语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说 "自审 ",并能直接操作程序的内部属性。Java 反射的能力在实际应用中非常有价值,例如,使用它能获得 ...

    java例子 java反射

    在Java学习中,反射常用于插件开发、框架设计、测试工具和元数据处理等场景。它的灵活性使得我们可以编写更加通用和动态的代码,但也需要注意滥用反射可能带来的性能损失和安全问题。 在给出的“JavaClass”示例中...

    Java反射案例

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和Field...

    Java反射机制学习总结

    Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于java.lang.reflect包中的API,主要包括Class类、Constructor类、Method类和Field类。以下是...

    java学习笔记(java 反射机制 流 内存管理)

    本笔记主要涵盖了四个核心知识点:Java反射机制、流(I/O流)、内存管理和Java学习的基础。以下是对这些主题的详细阐述: 一、Java反射机制 Java反射机制是Java语言的一个强大特性,允许程序在运行时检查类、接口、...

    java反射源代码

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有高度的灵活性,尤其在处理框架、插件系统以及元数据驱动...

    Java反射demo

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个“Java反射demo”很可能是包含了一些示例代码,用于演示如何在实际开发中...

    Java反射常用机制

    Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。这个特性使得Java代码能够具备高度的动态性,能够在未知类结构的情况下进行操作,增强了程序的灵活性。在Java中...

    java反射-英文版反射规范

    ### Java反射机制详解 #### 一、概述 ...通过以上介绍,我们不仅深入了解了Java反射的基本概念和应用场景,还学习了如何利用反射来处理各种类型的数据结构。这对于深入理解和应用Java语言具有重要意义。

    Java反射机制的学习

    Java反射机制是Java编程语言中的一项核心特性,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java能够在编译后仍然能够灵活地处理类和对象,增强了代码的动态性。在Android应用开发中,反射机制尤其重要...

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....

    fanshe_JAVA.zip_java 反射

    Java反射是Java编程语言中的一个核心特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。...学习和掌握反射不仅可以提升编程的灵活性,也是成为Java高级开发者必备的技能之一。

    Java反射相当的文档及示例

    理解并熟练掌握Java反射对于深入学习Java和开发复杂的系统至关重要。然而,由于反射可能导致性能下降、安全性问题和增加代码复杂性,因此在使用时应谨慎权衡其优缺点,只在必要时使用。在实际项目中,通常会结合其他...

Global site tag (gtag.js) - Google Analytics