Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,也有称作“自省”。反射非常强大,它甚至能直接操作程序的私有属性。反射就像一面镜子,它可以在运行时获取一个类的所有信息,可以获取到任何定义的信息(包括成员变量,成员方法,构造器等),并且可以操纵类的字段、方法、构造器等部分。
-
获取字节码对象
Class.forName(“类的全路径”);
/*测试暴力反射物料*/
public class Person {
private String name;
private int age;
private void save(int n ,String s){
System.out.println("保存");
}
private void update(){
System.out.println("更新");
}
}
import org.junit.Test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/*测试暴力反射*/
public class TetstReflect2 {
@Test
public void getFie() throws Exception {
//获取字节码对象
Class<Person> clazz = Person.class;
//获取指定的私有属性
Field df = clazz.getDeclaredField("name");
System.out.println(df);
System.out.println(df.getType());
//获取私有属性的类型
System.out.println(df.getType().getName());
//设置获取到的字段对象的属性值
Object o = clazz.newInstance();
//设置私有可见的权限
df.setAccessible(true);
df.set(o,"张三");//设置属性值
System.out.println(df.get(o) );//获取属性值
}
@Test
public void getFie2() throws Exception {
//获取字节码对象
Class<?> clazz = Person.class;
//获取私有属性age
Field df = clazz.getDeclaredField("age");
//通过字节码对象创建对象
Object o = clazz.newInstance();
//设置私有属性可见权限
df.setAccessible(true);
df.set(o,35);
System.out.println(df.get(o) );
}
//测试暴力反射技术获取并执行私有方法
@Test
public void getFun() throws Exception {
//获取字节码对象
Class<?> clazz = Person.class;
//获取指定方法
Method m = clazz.getDeclaredMethod("save", int.class, String.class);
//通过反射技术创建对象
Object o = clazz.newInstance();
//获取是有方法可见权限
m.setAccessible(true);
/*通过反射技术给对应的对象执行对应的方法invoke(o,x,y,z...)
* o为指定对象,x,y,z....方法的传入参数*/
m.invoke(o,66,"测试");
}
@Test
public void getFun2() throws Exception{
//1.获取字节码对象
Class<Person> clazz = Person.class;
//通过字节码对象获取指定方法
Method m = clazz.getDeclaredMethod("update");
//获取执行私有方法权限
m.setAccessible(true);
//创建对象
Person o = clazz.newInstance();
//执行方法
m.invoke(o);
}
}
日期转换工具类SimpleDateFormat
public class TestDate {
public static void main(String[] args) throws ParseException {
Date d1 = new Date();
System.out.println(d1);
DateUtils du = new DateUtils();
String s = du.dateToString("yyyy年MM月dd日 hh:mm:ss", d1);
System.out.println(s);
Date d2 = du.stringToDate(s, "yyyy年MM月dd日 hh:mm:ss");
System.out.println(d2);
}
}
public class DateUtils {
public String dateToString(String format, Date d){
SimpleDateFormat sdf = new SimpleDateFormat(format);
String s1 = sdf.format(d);
return s1;
}
public Date stringToDate(String s,String format) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date d1 = sdf.parse(s);
return d1;
}
}
import java.text.SimpleDateFormat;
import java.util.Date;
//测试日期转换工具类
public class TestSimpleDateFromat {
public static void main(String[] args) {
//创建日期类对象
Date d1 = new Date();
Date d2 = new Date();
//创建日期类转换工具
SimpleDateFormat sdf = new SimpleDateFormat();
String s1 = sdf.format(d1);//通过转换工具转换日期
System.out.println(s1);
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
String s2 = sdf1.format(d2);
System.out.println(s2);
System.out.println(d1.getTime());//获取从标准基准时间到现在时间的毫秒值
System.out.println(d1.getTime()/1000/60/60/24/365);
}
}