Java反射机制示例

链接:

http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html

 

package com.stono.reftest;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Ref {
    @SuppressWarnings("unused")
    public static void main(String[] args) throws Exception {
        // 实例化Class对象;Class是所有类的类;
        Glyph glyph = new Glyph();
        Class<? extends Glyph> class1 = glyph.getClass();
        Class<?> class2 = Glyph.class;
        Class<?> class3;
        class3 = Class.forName("com.stono.reftest.Glyph");
        // 通过Class对象实例化类;必须有无参构造函数
        Glyph glyph2 = class1.newInstance();
        // 通过Class对象获取构造函数;
        Constructor<?>[] constructors = class1.getConstructors();// 长度为1
        // 获取构造函数的Modifier
        int modifiers = constructors[0].getModifiers();
        // 获取Modifier字符串;
        String modifierStr = Modifier.toString(modifiers);
        // 获取构造函数的参数类型;
        Class<?>[] parameterTypes = constructors[0].getParameterTypes();
        // 通过构造函数进行对象构造;
        Glyph glyph3 = (Glyph) constructors[0].newInstance();
        // 获取类的所有接口;
        Class<?>[] interfaces = class3.getInterfaces();
        // 获取类的父类
        Class<?> superclass = class3.getSuperclass();
        // 获取类的所有方法,不会返回构造函数;
        Method[] methods = class3.getMethods();
        // 获取异常类型;Constructor和Method都继承自AccessibleObject
        Class<?>[] exceptionTypes = methods[0].getExceptionTypes();
        Class<?>[] exceptionTypes2 = constructors[0].getExceptionTypes();
        // 获取本地全部属性;包括公共和私有;
        Field[] fields = class3.getDeclaredFields();
        // 取得公共属性;
        Field[] fields2 = class3.getFields();
        // 获取method
        Method m = class3.getMethod("writeGlyph", String.class);
        // 调用method
        m.invoke(class3.newInstance(), "g");
        // 获取某一个属性,可以是私有的;
        Field field = class3.getDeclaredField("name");
        // 设置其访问权限;
        field.setAccessible(true);

    // 获得属性值 参考:http://blog.csdn.net/restraint/article/details/17951453
    Object val = field.get(glyph3);//得到此属性的值 

// 进行属性的设置; field.set(class3.newInstance(), "male"); // 定义数组; int[] iarr = { 1, 2, 3, 4, 5 }; // 获取数组元素的类型; Class<?> componentType = iarr.getClass().getComponentType(); // 获取数组长度; int length = Array.getLength(iarr); // 获取数组第二个元素; Array.get(iarr, 1); // 设置数组第二个元素; Array.set(iarr, 2, 200); // 创建某类型的数组;长度为10; Object newArray = Array.newInstance(componentType, 10); // 进行数组拷贝 System.arraycopy(iarr, 0, newArray, 0, length); } } @SuppressWarnings("unused") class Glyph implements icon { private String name; public Glyph() { } public void writeGlyph(String g) { System.out.println(g); } } interface icon { }