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

反射例子

阅读更多
定义一个用户,作为被反射对象;
public class User {

    public String     username;
    private String    password;
    public static int age = 12;

    public User(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }
    
    public User(String username, int age) {
        super();
        this.username = username;
        User.age = age;
    }

    public String getUsername() {
        return username;
    }

    public User() {
        super();
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void talkName(String myName) {
        if (myName != null && myName.length() > 0) {
            System.out.println("myname is " + myName);
        } else {
            System.out.println("myname is " + username);
        }

    }

    public static void talkAge() {
        System.out.println("My age is " + age);
    }
}


写一个反射程序:


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author <a href="mailto:zhouxiaofeng0710@hotmail.com">xiaofeng.zhouxf</a>
 * @version 1.0
 * @date 2009-4-20
 */
public class ReflectionTest {

    public void fields(Object obj) {
        Class clazz = obj.getClass();
        Field[] fields = clazz.getFields();
        System.out.println("fields;  fields num:" + fields.length);
        for (Field field : fields) {
            System.out.println("fields;  field name:" + field.getName());
            System.out.println("fields;  field modifyers:" + field.getModifiers());
            System.out.println("fields;  只能取到共有的属性!");
        }
    }

    public Object getfield(Object obj, String fieldName) {
        Class clazz = obj.getClass();
        Object object = null;
        try {
            Field field = clazz.getField(fieldName);
            // 取得当前实例的属性
            object = field.get(obj);
            System.out.println("getfield ; field name:" + field.getName());
            System.out.println("getfield ; field value:" + object.toString());
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return object;
    }

    public Object getStatticfield(String className, String fieldName) {
        Class clazz = null;
        try {
            clazz = Class.forName(className);
        } catch (ClassNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        Object object = null;
        try {
            Field field = clazz.getField(fieldName);
            // 取得当前类的属性 因为是取静态的,所以可以直接取,如果不是静态的,会报异常
            // java.lang.IllegalArgumentException
            object = field.get(clazz);
            System.out.println("getStatticfield ; field name:" + field.getName());
            System.out.println("getStatticfield ; field value:" + object.toString());
            System.out.println("getStatticfield ; 取得当前类的属性 因为是取静态的,所以可以直接取,如果不是静态的,会报异常:java.lang.IllegalArgumentException");
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return object;
    }

    public void invokeMethod(Object object, String methodName, Object[] argsParam) {

        try {
            Class clazz = object.getClass();
            Class[] classArgs = new Class[argsParam.length];
            int i = 0;
            for (Object obj : argsParam) {
                classArgs[i++] = obj.getClass();
            }
            Method method = clazz.getMethod(methodName, classArgs);
            method.invoke(object, argsParam);
            System.out.println("invokeMethod ; 调用当前类的方法");
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void invokeStaticMethod(String className, String methodName, Object[] argsParam) {

        try {
            Class clazz = Class.forName(className);
            Class[] classArgs = new Class[argsParam.length];
            int i = 0;
            for (Object obj : argsParam) {
                classArgs[i++] = obj.getClass();
            }
            Method method = clazz.getMethod(methodName, classArgs);
            method.invoke(null, argsParam);
            System.out.println("invokeMethod ; 调用当前类的方法");
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public Object newInstance(String className, Object[] args) {
        Class clazz = null;
        Object resObj = null;
        try {
            clazz = Class.forName(className);

            Class[] cArgs = new Class[args.length];
            int i = 0;
            for (Object obj : args) {
                cArgs[i++] = obj.getClass();
            }
            Constructor cr = clazz.getConstructor(cArgs);
            resObj = cr.newInstance(args);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return resObj;
    }

    public static void main(String[] args) {
        User user = new User();
        user.setUsername("Tracy");
        ReflectionTest test = new ReflectionTest();
        System.out.println("=============取属性==================>>>>>");
        test.fields(user);
        System.out.println("=============取实例的属性和值==================>>>>>");
        String username = (String) test.getfield(user, "username");
        System.out.println("getfield ; username:" + username);
        System.out.println("=============取类的静态属性和值==================>>>>>");
        test.getStatticfield("com.zhouxf.reflection.User", "age");
        System.out.println("=============调用类的方法==================>>>>>");
        test.invokeMethod(user, "talkName", new String[] { "Tracy" });
        System.out.println("=============调用类的静态方法==================>>>>>");
        test.invokeStaticMethod("com.zhouxf.reflection.User", "talkAge", new String[] {});
        System.out.println("=============创建实例==================>>>>>");
        User user1 = (User) test.newInstance("com.zhouxf.reflection.User", new Object[] { "tracy", 36 });
        user1.talkName("");
        user1.talkAge();
    }
}



输出结果:
=============取属性==================>>>>>
fields;  fields num:2
fields;  field name:username
fields;  field modifyers:1
fields;  只能取到共有的属性!
fields;  field name:age
fields;  field modifyers:9
fields;  只能取到共有的属性!
=============取实例的属性和值==================>>>>>
getfield ; field name:username
getfield ; field value:Tracy
getfield ; username:Tracy
=============取类的静态属性和值==================>>>>>
getStatticfield ; field name:age
getStatticfield ; field value:12
getStatticfield ; 取得当前类的属性 因为是取静态的,所以可以直接取,如果不是静态的,会报异常:java.lang.IllegalArgumentException
=============调用类的方法==================>>>>>
myname is Tracy
invokeMethod ; 调用当前类的方法
=============调用类的静态方法==================>>>>>
My age is 12
invokeMethod ; 调用当前类的方法
=============创建实例==================>>>>>
java.lang.NoSuchMethodException: com.zhouxf.reflection.User.<init>(java.lang.String, java.lang.Integer)



这里有几个问题:
1.为什么每次都要把参数组织一边,如
Class[] classArgs = new Class[argsParam.length];
            int i = 0;
            for (Object obj : argsParam) {
                classArgs[i++] = obj.getClass();
            }


2.为什么最后为什么会报错呢

思考下.....


==================================

1>  引用下侯捷对Class的解释:
Class class十分特殊。它和一般classes一样继承自Object,其实体用以表达Java程序运行时的classes和interfaces,也用来表达enum、array、primitive Java types
(boolean, byte, char, short, int, long, float, double)以及关键词void。当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class object。 
Class[] classArgs = new Class[argsParam.length];
            int i = 0;
            for (Object obj : argsParam) {
                classArgs[i++] = obj.getClass();
            }

循环是对Class对应参数的定义,每一个参数加载后都会是一个Class(不知道是否应该如此理解,如有错误,请指正);
2.发现age如果为Integer 的话,就可以了
public class User {

    public String         username;
    private String        password;
    public static Integer age = 12;

    public User(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }

    public User(String username, Integer age) {
        super();
        this.username = username;
        User.age = age;
    }

    public String getUsername() {
        return username;
    }

    public User() {
        super();
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void talkName(String myName) {
        if (myName != null && myName.length() > 0) {
            System.out.println("myname is " + myName);
        } else {
            System.out.println("myname is " + username);
        }

    }

    public static void talkAge() {
        System.out.println("My age is " + age);
    }
}



运行结果:
=============创建实例==================>>>>>
myname is tracy
My age is 36


那就是说,构造函数里面,基本类型是不支持反射的;
分享到:
评论

相关推荐

    简单的反射例子

    在探讨“简单的反射例子”这一主题时,我们深入解析了反射在C#中的应用,以及如何利用反射来访问和操作对象的属性。反射是.NET框架中的一个强大特性,它允许程序在运行时检查和调用类型的信息,包括类型、方法、属性...

    java反射例子,封装了一个反射帮助类

    在标题和描述中提到的“java反射例子,封装了一个反射帮助类”,这表明我们有一个实用工具类,可以帮助简化使用反射的复杂过程。 首先,让我们理解Java反射的基本概念。当我们的程序运行时,我们可以通过Class类来...

    nginx反射例子,亲测可用!

    在这个"nginx反射例子"中,我们将深入探讨如何利用Nginx实现反射(也称为回显)功能,这是一种将接收到的请求数据原封不动地返回给客户端的技术。 反射功能在测试、调试和安全研究中非常有用,可以帮助我们理解网络...

    php 反射简单例子

    下面是一个简单的PHP反射例子,展示了如何使用反射来获取并调用私有方法: ```php class MyClass { private $value = 42; private function secretMethod($add) { return $this-&gt;value + $add; } } $instance...

    C#(2.0)反射例子(VS 2005)

    这个"C#(2.0)反射例子"是针对Visual Studio 2005的一个实例,旨在帮助开发者深入理解反射的基本概念和实际应用。在这个项目中,我们将探讨以下几个关键知识点: 1. **类型信息获取**:反射允许程序在运行时获取...

    详细的C#反射例子(项目文件)

    这个"详细的C#反射例子(项目文件)"显然包含了关于如何使用C#反射的实际应用示例,这对于理解并掌握这一核心概念至关重要。 反射允许程序员在运行时执行以下操作: 1. **获取类型信息**:通过Type类,可以获取...

    java 反射例子 代码

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

    Java反射简单例子

    考虑到这是一个简单的反射例子,`ReflectTest.java`可能包含以下内容: ```java public class ReflectTest { public String echo(String msg) { return "Echo: " + msg; } public static void main(String[] ...

    c# 反射例子 reflector

    "反射例子 reflector"这个主题深入浅出地展示了如何利用C#的反射功能来增强代码的灵活性和动态性。下面我们将详细探讨反射的概念、用途,以及如何在实际编程中运用。 首先,反射允许我们动态地获取类型信息。在C#中...

    ASP的一个面向接口的反射例子

    在这个“面向接口的反射例子”中,我们将深入探讨ASP.NET中的两个关键概念:面向接口编程和反射。 首先,面向接口编程(Interface-Oriented Programming, IOP)是面向对象编程的一种策略,它强调设计和实现时以接口...

    一个C#反射例子附源码

    这个“一个C#反射例子附源码”的资源提供了一个具体的实例,帮助开发者深入理解如何在实际项目中使用反射。下面我们将详细探讨C#反射的相关知识点。 1. **什么是反射**: 反射是.NET框架提供的功能,它允许程序在...

    java反射例子

    首先,从标题“java反射例子”来看,这部分内容将围绕Java反射技术的具体应用展开。Java反射API提供的主要类包括java.lang.Class、java.lang.reflect.Constructor、java.lang.reflect.Method和java.lang.reflect....

    c#反射例子(源码)

    这个例子(源码)提供了深入理解C#反射机制的机会。以下是对标题和描述中涉及知识点的详细解释: 1. **什么是反射?** 反射是程序在运行时获取自身信息的能力,包括类、接口、属性、方法等元数据。它允许我们动态...

    c#反射例子的用法(

    ### C#反射技术详解 #### 一、反射技术概述 反射是C#中一项非常强大的功能,它允许程序在运行时动态地获取自身的类型信息、方法、属性等,并且能够创建对象实例、调用方法、设置或获取字段值等。这种能力在很多...

    JAVA反射简单例子

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Spring框架中,反射扮演着核心角色,...希望这个简单的反射例子能帮助你更好地理解和运用Java反射。

    JAVA反射机制及应用例子

    JAVA反射机制及应用例子.。。Reflection API

    java反射例子 希望可以帮助大家

    在Java编程语言中,反射(Reflection)是一种强大的工具,允许程序在运行时检查和操作类、接口、字段和方法的信息。它使得开发者能够编写更加灵活和动态的代码,可以处理未知类型的数据,或者在不修改源代码的情况下...

    C#反射例子.是学习c#反射的好东西

    C#反射是一个强大的工具,它允许程序在运行时获取类型信息、创建对象、调用方法以及访问和修改字段。在C#中,反射是通过System.Reflection命名空间中的类来实现的。下面我们将深入探讨C#反射的核心概念和常用操作。 ...

    C#反射例子

    在.NET框架中,C#反射是一种强大的特性,它允许运行时的代码检查自身,并与自身交互,无需在编译时知道具体的类型信息。这个特性在许多场景下都非常有用,例如在插件系统、序列化、元数据操作以及动态类型创建等。在...

    C#中运用反射的简单例子

    在C#编程中,反射是一种强大的机制,它允许运行时的程序检查自身并操作其类型信息。通过反射,我们可以动态地创建对象、调用方法、访问属性和字段,以及加载和执行Assembly。这个主题对于任何想要提升编程技能的C#...

Global site tag (gtag.js) - Google Analytics