笔者的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()));
}
}
}
反射的第一阶段就这样先了!
转载请注明出处,谢谢!