当前位置:编程学习 > JAVA >>

Using Java Reflection

Reflection is a feature in the Java programming language. It allows an executing Java program to examine or "introspect" upon itself, and manipulate internal properties of the program. For example, it's possible for a Java class to obtain the names of all its members and display them.

The ability to examine and manipulate a Java class from within itself may not sound like very much, but in other programming languages this feature simply doesn't exist. For example, there is no way in a Pascal, C, or C++ program to obtain information about the functions defined within that program.

One tangible use of reflection is in JavaBeans, where software components can be manipulated visually via a builder tool. The tool uses reflection to obtain the properties of Java components (classes) as they are dynamically loaded.

A Simple Example

To see how reflection works, consider this simple example:


package org.duke.java.reflect;

import java.lang.reflect.Method;

public class DumpMethods {
    public static void main(String[] args) {
        try {
            args = new String[] { "java.util.Stack" };
            Class c = Class.forName(args[0]);
            // Returns an array of Method objects reflecting all the methods
            // declared by the class or interface represented by this Class
            // object.
            Method m[] = c.getDeclaredMethods();

            for (int i = 0; i < m.length; i++)
                System.out.println(m[i].toString());

            System.out.println("--------------------");
            // Returns an array containing Method objects reflecting all the
            // public member methods of the class or interface represented by
            // this Class object, including those declared by the class or
            // interface and those inherited from superclasses and
            // superinterfaces.
            Method[] methods = c.getMethods();
            for (Method method : methods) {
                System.out.println(method.toString());
            }
        } catch (Throwable e) {
            System.err.println(e);
        }

    }
}

the output is:

public synchronized boolean java.util.Stack.empty()
public synchronized java.lang.Object java.util.Stack.peek()
public synchronized java.lang.Object java.util.Stack.pop()
public java.lang.Object java.util.Stack.push(java.lang.Object)
public synchronized int java.util.Stack.search(java.lang.Object)
--------------------
public synchronized java.lang.Object java.util.Vector.clone()
public synchronized boolean java.util.Vector.equals(java.lang.Object)
public synchronized int java.util.Vector.hashCode()
public synchronized java.lang.String java.util.Vector.toString()
public synchronized boolean java.util.Vector.add(java.lang.Object)
public synchronized boolean java.util.Vector.addAll(java.util.Collection)
public void java.util.Vector.clear()
public boolean java.util.Vector.contains(java.lang.Object)
public synchronized boolean java.util.Vector.containsAll(java.util.Collection)
public synchronized boolean java.util.Vector.isEmpty()
public java.util.Iterator java.util.AbstractList.iterator()
public boolean java.util.Vector.remove(java.lang.Object)
public synchronized boolean java.util.Vector.removeAll(java.util.Collection)
public synchronized boolean java.util.Vector.retainAll(java.util.Collection)
public synchronized int java.util.Vector.size()
public synchronized java.lang.Object[] java.util.Vector.toArray()
public synchronized java.lang.Object[] java.util.Vector.toArray(java.lang.Object[])
public void java.util.Vector.add(int,java.lang.Object)
public synchronized boolean java.util.Vector.addAll(int,java.util.Collection)
public java.lang.Object java.util.Vector.get(int)
public int java.util.Vector.indexOf(java.lang.Object)
public synchronized int java.util.Vector.lastIndexOf(java.lang.Object)
public java.util.ListIterator java.util.AbstractList.listIterator()
public java.util.ListIterator java.util.AbstractList.listIterator(int)
public synchronized java.lang.Object java.util.Vector.remove(int)
public synchronized java.lang.Object java.util.Vector.set(int,java.lang.Object)
public synchronized java.util.List java.util.Vector.subList(int,int)
public synchronized void java.util.Vector.addElement(java.lang.Object)
public synchronized int java.util.Vector.capacity()
public synchronized void java.util.Vector.copyInto(java.lang.Object[])
public synchronized java.lang.Object java.util.Vector.elementAt(int)
public java.util.Enumeration java.util.Vector.elements()
public synchronized void java.util.Vector.ensureCapacity(int)
public synchronized java.lang.Object java.util.Vector.firstElement()
public synchronized int java.util.Vector.indexOf(java.lang.Object,int)
public synchronized void java.util.Vector.insertElementAt(java.lang.Object,int)
public synchronized java.lang.Object java.util.Vector.lastElement()
public synchronized int java.util.Vector.lastIndexOf(java.lang.Object,int)
public synchronized void java.util.Vector.removeAllElements()
public synchronized boolean java.util.Vector.removeElement(java.lang.Object)
public synchronized void java.util.Vector.removeElementAt(int)
public synchronized void java.util.Vector.setElementAt(java.lang.Object,int)
public synchronized void java.util.Vector.setSize(int)
public synchronized void java.util.Vector.trimToSize()
public synchronized boolean java.util.Stack.empty()
public synchronized java.lang.Object java.util.Stack.peek()
public synchronized java.lang.Object java.util.Stack.pop()
public java.lang.Object java.util.Stack.push(java.lang.Object)
public synchronized int java.util.Stack.search(java.lang.Object)
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long,int) throws java.lang.InterruptedException


That is, the method names of class java.util.Stack are listed, along with their fully q

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,