Deep learning about Java--贯穿Java的反射机制(1)

笔者的mybatis文章暂且先更新到第5篇,因为要继续深入理解mybatis的机制就不得不返回到我们的Java上,就是日后笔者继续写Hibernate的文章也是绕不过Java的反射机制。可以这么说,笔者认为如果没有了反射,Java就不会这么强大!
进入这片文章的正题前,先介绍一个好东西lombok.jar,这是个神器(可以帮助我们偷懒的神器),减少我们新建类的时候写一堆重复性的代码(这是JavaBean的要求)。

package com.unicorn.reflect.pojo;

import java.io.Serializable;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.Setter;
import lombok.ToString;

@NoArgsConstructor/**JavaBean规范:实现无参构造器*/
@ToString(exclude={"id"})/**JavaBean规范:重载tostring方法*/
@EqualsAndHashCode
public class Emp implements Serializable, Person{/**JavaBean规范:类名的单词首字母要大写,其余单词的首字母也要大写*/

    /**
     * JavaBean规范:实现序列化接口
     */
    private static final long serialVersionUID = -720655243074260608L;

    /**
     * JavaBean规范:实现getter and setter
     * 在这里使用lombok的注解简化冗余的代码
     */
    @Getter @Setter private Long id;/**JavaBean规范:属性只有两个字母的一律小写,如:qq*/
    @Getter @Setter private String empName;/**JavaBean规范:属性的单词首字母要小写,其余单词的首字母也要大写*/
    @Getter @Setter private String depart;
    @Getter @Setter private Double salary;
    @Getter @Setter public Byte Sex;
    public static final int STABLE_VAL = 1;

    public Emp(@NonNull Long id){
        this.id = id;
    }

    @Override
    public void testMethod() {
        // TODO Auto-generated method stub

    }

    @Override
    public void testMethod2() {
        // TODO Auto-generated method stub

    }

    @Override
    public int testMethod3(String str) {
        // TODO Auto-generated method stub
        return 0;
    }

//  @Override public boolean equals(Object o){
//      if(o == this)
//          return true;
//      if(!(o instanceof Emp))
//          return false;
//  }
}

棒极了(主要是能偷懒了,不过笔者劝解:你要是在初学阶段就老老实实地按着Javabean的规范干活,写吧!哈哈哈!)!笔者认为以后代码量是会一直以减少的趋势发展的,简洁的代码实现复杂的功能,笔者忍不住窃喜!估计日后编程语言的发展是真的会普及到大众都能读懂都能会写,就像近代中国废除文言文,举国上下文、言一直都是白话文(当然世界的语言发展一直都是这样的,中国不过是其中的一部分),擦亮眼睛看看到时那个编程界的哪天不高兴了干了和胡适(发表《文学改良刍议》)类似的事发一篇《编程改良刍议》!

要想轻松地使用lombok.jar就要先会安装它,先下载lombok.jar(本来想上传赚点积分的) : lombok.jar download url
笔者使用的RapidClipse(eclipse的加强版!!!其实就是配好环境和tools的eclipse),lombok的安装居然是扫描不到RapidClipse的,这里请允许笔者吐槽一下这有点智障!!!无奈,笔者只能手动安装也是棒极了!

1.常规下的eclipse如何安装:
打开你的cmd(1. 通过小娜;2.ctrl+R:input cmd;自己安装一个高大上的命令行,笔者推荐cmder)
输入如下的命令(不要在意背景的女主!她好像是位歌手,笔者也想知道她叫什么名字,知道的留个言呗!谢谢!):
这里写图片描述
路径要自己打!

java -jar ..\lombok.jar

这里写图片描述
很明显歧视笔者的RapidClipse!算了,见到上图类似的情景后,点击install就可以安装了!
装好后,打开eclipse所在目录的eclipse.ini配置文件,看看有没有如下的两段配置语句:
这里写图片描述
这里写图片描述
如果没有的就自己添上去!

-javaagent:lombok.jar
-Xbootclasspath/a:lombok.jar

如上工作都完成后,就重启eclipse并导入lombok.jar的包到你的工程下:
project上右键->properties->Java BuildPath->Libaries->add external.jars(添加lombok.jar)
project上右键->properties->Java BuildPath->Libaries->add libaries(添加junit4)
这里写图片描述
如上操作就可以使用了!

2.手动安装

-javaagent:lombok.jar
-Xbootclasspath/a:lombok.jar

把上述的配置直接写到eclipse.ini上,并把lombok.jar放到同一文件夹下即可(也可以放到plugins中)。
这里写图片描述

3.进入reflect

public interface Person {
    public void testMethod();

    public void testMethod2();

    public int testMethod3(String str);
}
package com.unicorn.reflect.service;

import org.junit.Test;

import com.unicorn.reflect.pojo.Emp;

public class GetClassName {

    @Test
    public void getClazzName(){
        //way1:通过类本身来获取,也就是this
                Class firstClass = this.getClass();
                System.out.println(firstClass.getName());
                System.out.println(firstClass.getSimpleName());

                //way2:通过类的实例化对象本身来获取
                Emp e = new Emp();
                Class secondClass = e.getClass();
                System.out.println(secondClass.getName());
                System.out.println(secondClass.getSuperclass().getName());
                System.out.println(secondClass.getSimpleName());
                System.out.println(secondClass.getSuperclass().getSimpleName());

                //way3:通过类的全限定名获取
                Class thirdClass = com.unicorn.reflect.pojo.Emp.class;
                System.out.println(thirdClass.getName());
                System.out.println(thirdClass.getSimpleName());

                //way4:通过类的权限定名的字符串获取
                try {
                    Class fourthClass = Class.forName("com.unicorn.reflect.pojo.Emp");
                    System.out.println(fourthClass.getName());
                    System.out.println(fourthClass.getSimpleName());
                } catch (ClassNotFoundException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
    }

}
package com.unicorn.reflect.service;

import org.junit.Test;

import com.unicorn.reflect.pojo.Emp;

public class GetClassTest {

    /**
     * 获取类对象的方式有4种
     */
    @SuppressWarnings("rawtypes")
    @Test
    public void getClassWays(){
        //way1:通过类本身来获取,也就是this
        Class firstClass = this.getClass();
        System.out.println(firstClass);

        //way2:通过类的实例化对象本身来获取
        Emp e = new Emp();
        Class secondClass = e.getClass();
        System.out.println(secondClass);
        System.out.println(secondClass.getSuperclass());

        //way3:通过类的全限定名获取
        Class thirdClass = com.unicorn.reflect.pojo.Emp.class;
        System.out.println(thirdClass);

        //way4:通过类的权限定名的字符串获取
        try {
            Class fourthClass = Class.forName("com.unicorn.reflect.pojo.Emp");
            System.out.println(fourthClass);
        } catch (ClassNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

    }

}
package com.unicorn.reflect.service;

import java.lang.reflect.Constructor;

import org.junit.Test;

/**
 * 获取类中声明的构造器
 * @author Unicorn
 *
 */
public class GetConstructor {

    @Test
    public void getConstructorTest(){
        try {
            Class clazz = Class.forName("com.unicorn.reflect.pojo.Emp");
            Constructor[] cs = clazz.getDeclaredConstructors();//这种方式能够获取所有已经声明的构造器,不收到访问权限的限制

            for (Constructor constructor : cs) {
                System.out.println(constructor.getModifiers() + " "+ constructor.getName());
                Class[] temp = constructor.getParameterTypes();
                for (Class class1 : temp) {
                    System.out.println(class1.getName());
                }
            }

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package com.unicorn.reflect.service;

import java.lang.reflect.Field;

import org.junit.Test;

/**
 * 获取类中成员属性的数据类型,也成为域
 * @author Unicorn
 *
 */
public class GetField {

    @Test
    public void getFieldTest(){
        try {
            Class clazz = Class.forName("com.unicorn.reflect.pojo.Emp");
            Field[] fl = clazz.getFields();
            for (Field field : fl) {
                System.out.println(field.getName() + " " +field.getType().getName());//这里由于权限的问题,只能获取访问权限为public的域
            }

            System.out.println("===============================");

            fl = clazz.getDeclaredFields();
            for (Field field : fl) {
                System.out.println(field.getName() + " " +field.getType().getName());//这里可以获取所有已经声明的域
            }

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
package com.unicorn.reflect.service;

import org.junit.Test;

/**
 * 类实现的interface
 * 在Java中类的继承只能是单一的,也就是说,一个类只能继承一个父类,然而,一个却可以允许实现多个接口
 * @author Unicorn
 *
 */
public class GetInterface {

    @Test
    public void getInterfaceTest(){
        try {
            Class _class = Class.forName("com.unicorn.reflect.pojo.Emp");
            Class[] its = _class.getInterfaces();
            int i = 0;
            for (Class c : its) {
                System.out.println(++i + " the inteface is: " + c.getName());//打印出实现了的所有接口的全限定名
            }

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
package com.unicorn.reflect.service;

import java.lang.reflect.Method;

import org.junit.Test;

/**
 * 获取类中声明的所有方法
 * @author Unicorn
 *
 */
public class GetMethod {

    @Test
    public void getMethodTest(){
        try {
            Class clazz = Class.forName("com.unicorn.reflect.pojo.Emp");
            Method[] m = clazz.getDeclaredMethods();//这里也是不受访问权限限制的
            for (Method method : m) {
                System.out.println(method.getReturnType() + "" + method.getName());
                Class[] param = method.getParameterTypes();
                for (Class class1 : param) {
                    System.out.println(class1.getName());
                }
                Class[] ex = method.getExceptionTypes();
                for (Class class1 : ex) {
                    System.out.println(class1.getName());
                }
                System.out.println("================================");
            }

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package com.unicorn.reflect.service;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

import org.junit.Test;

/**
 * Modifier变量域的检索
 * @author Unicorn
 *
 */
public class GetModifier {

    @SuppressWarnings("rawtypes")
    @Test
    public void getModifierTest() throws ClassNotFoundException{
        Class _class = Class.forName("com.unicorn.reflect.pojo.Emp");
        int num = _class.getModifiers();
        System.out.println("the number of Modifier:" + num);

        Field[] fl = _class.getDeclaredFields();
        int i = 0;
        for (Field field : fl) {
            System.out.println(++i + " this modifier is: " + Modifier.toString(field.getModifiers()));
        }
    }

}

反射的第一阶段就这样先了!
转载请注明出处,谢谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值