继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java反射机制~学习实例

Husse
关注TA
已关注
手记 9
粉丝 15
获赞 190
概念
  • 反射机制

反射是用来解刨Java的类、构造器(Constructor)、方法(Method)、属性(Field)等元素的信息。
反射是为了动态地加载一个类,动态调用一个方法,动态访问一个属性等要求而设计的,通过使用
java.lang.reflect下面的API。

  • Class

每一个Class类一种被加载进入JVM的类,代表该类的一种信息映射。通过下面三种方式可获取Class对象

1、Class类的forname()方法返回

2、访问所有类都会拥有的静态class属性

3、调用所有对象都会有的getClass方法

实现

ReflectClass.java


package com.pro.reflect;
/**
 * 反射实体类
 * @author GeekHou
 */
public class ReflectClass {
    protected String name;
    protected int age;
    public ReflectClass(String name,int age) {
        this.name = name;
        this.age = age;
    }
    public ReflectClass() {
        super();
    }
    public void testMethod() {
        System.out.println("testMethord is called...");
    }
}
package com.pro.reflect;

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

public class ClassTest {

    public static void main(String[] args) {
        // 1 反射操作类的成员变量
        ReflectClass obj1 = new ReflectClass("张三",24);
        ReflectClass obj2 = new ReflectClass("李四",25);
        System.out.println("操作类的成员变量:"+compare(obj1, obj2).name+"年龄大一点");

        // 2 反射实例化类 ,需要实现默认构造函数
        String methodName = "testMethod";
        Class<ReflectClass> clazz = ReflectClass.class;// 获得class实例

        try {
            Method method = clazz.getMethod(methodName);// 获得指定方法名的Method对象
            if (method != null) {
                ReflectClass obj = clazz.newInstance();// 无参方式创建对象
                method.invoke(obj);// 调用obj指定的方法
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 3 反射实例化一个类
        try {
            Constructor<ReflectClass> reflectClass = clazz.getConstructor(String.class,int.class);
            ReflectClass reflectObj = reflectClass.newInstance("小子",21);
            System.out.println(reflectObj);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * 操作类的成员变量
     * @param obj1
     * @param obj2
     * @return
     */
    private static ReflectClass compare(ReflectClass obj1,ReflectClass obj2) {
        // 两种方式获取一个Field对象
        try {
//          Field field = obj1.getClass().getDeclaredField("age");
            Field field = ReflectClass.class.getDeclaredField("age");
            // 访问私有成员
            // field.setAccessible(true);
            int age1 = (Integer)field.get(obj1);
            int age2 = (Integer)field.get(obj2);
            if (age1>age2) {
                return obj1;
            } else {
                return obj2;
            }
        }  catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
延伸

Struts2 Hibernate Spring中均使用反射的机制实现,特别是Spring中的依赖注入反转控制、面向切面编程融入了反射的思想。

附上几个使用反射实例实现验证及Spring的链接
1、Java 简单校验框架
2、基于java反射的验证框架
3、非常好的Java反射例子
4、Spring反射机制
[ 作者csdn博客]

打开App,阅读手记
5人推荐
发表评论
随时随地看视频慕课网APP