Eclipse 调试
源文件左边单击可以增加断点,右键->debug as->java apalication切换到debug模式,有以下快捷键
F5 step into 进入方法
F6 step over 跳到下一行
F7 step return 方法返回
F8 resume 跳到下一个方法
断点调试完要停止虚拟机,并且清除所有标记的断点。
在debug视图中,在右上方的breakpoints可以看到所有breakpoints,单击remove all breakpoints清除。
Eclipse快捷键
修改快捷键 Windows->General->Keys 修改快捷键
alt+/ 内容提示
ctrl+shift+F 格式化代码
快速修复 ctrl+1
导包 ctrl+shift+o
查看源码向前向右 alt+左/右方向键
添加注释 ctrl+shift+/
除去注释 ctrl+shift+\
更改为大写 ctrl+shift+X
更改为小写 ctrl+shfit+Y
复制行 ctrl+shift+向下键
查看类的继承关系 ctrl+T
查看源码:
1、ctrl+鼠标左键
2、ctrl+shift+T
JUnit测试方法
1、在测试方法增加@Test注解
2、在outline视图中可以看到有被@Test注解的方法名,右键run as->junit
3、用junit同时调试多个被@Test注解的方法 右键类名->run as->junit
// 用junit来测试java的方法
// @Test注解要被调试的方法
// @BeforeClass和@Afterlass注解的方法必须是静态方法,分别在类的加载前和类的释放后执行
// @Before和@After注解的方法在每个方法执行前、后都会被执行
// Assert断言,当实际值与返回值相等是,测试通过,JUnit为绿条,否则为红条
// Assert.assertEquals("Vermouth", "Wine");
// Assert.assertEquals有两个参数,第一个为期望值,第二个为实际值,当期望值与实际值相等时,测试通过,否则测试失败
反射
反射:形象理解为解剖,获取一个类的构造方法、方法、字段
方法:先获取一个类的Class对象,该对象封装了该类的字节码。通过这个Class对象,可以反射(解剖)出该类的构造方法,方法,字段
怎样获取Class对象呢?通常有三个方法
//Clss.forName(),参数为类名的完整名称,包括报名
Class clazz = Class.forName("cc.vermouth.reflect.Perso");
Class clazz1 = Person.class;
Class clazz2 = new Person().getClass();
获取一个类的构造方法、方法、字段
1、反射出构造方法
反射出公有构造方法
Class clazz = Class.forName("cc.vermouth.reflect.Person");
//参数为构造方法的参数类型
Constructor c = clazz.getConstructor(String.class);
Object obj = c.newInstance("张三");//传入构造函数需要的参数
Class clazz = Class.forName("cc.vermouth.reflect.Person");
//参数为构造方法的参数类型
Constructor c = clazz.getDeclaredConstructor(String.class);
c.setAccessible(true);//打开private的构造方法的访问权限
Object obj = c.newInstance("张三");//传入构造函数需要的参数
Class clazz = Class.forName("cc.vermouth.reflect.Person");
Object obj = clazz.getConstructor(String.class).newInstance("张三");
//反射私有的方法用getDeclaredMethod
Method method = clazz.getDeclaredMethod("wash", String.class);
method.setAccessible(true);//打开private方法的访问权限
method.invoke(obj, "洗澡房");
Class clazz = Class.forName("cc.vermouth.reflect.Person");
Object obj = clazz.getConstructor(String.class).newInstance("张三");
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);//访问私有字段要打开访问权限
String str = (String) field.get(obj);
System.out.println(str);
Class clazz = Class.forName("cc.vermouth.introspector.Person");//获取Person类的字节码
Object obj = clazz.getConstructor(String.class).newInstance("张三");//获取Person类的实例
PropertyDescriptor pd = new PropertyDescriptor("name",cc.vermouth.introspector.Person.class);
Method set = pd.getWriteMethod();//获取name属性的set方法
set.invoke(obj, "李四");//调用name属性的set方法,把“李四”写入属性
Method get = pd.getReadMethod();//获取name属性的get方法
System.out.println(get.invoke(obj, null));//获取obj对象的name字段
ConvertUtils.register(new Converter() {
@Override
public <T> T convert(Class<T> type, Object value) {
if(value == null)
return null;
if(!(value instanceof String))
throw new ConversionException("不支持转换类型");
String svalue = (String) value;
if(svalue.trim().equals(""))
return null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return (T) sdf.parse(svalue);
} catch (ParseException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
}, Date.class);
//反射获得Person对象
Object obj = Class.forName("cc.vermouth.beanutil.Person").
getConstructor().newInstance();
//BeanUtils 读写bean的属性,
//setProperty 第一个参数为bean对象,第二个为属性名称,第三个为属性值
BeanUtils.setProperty(obj, "name", "苦艾酒");
BeanUtils.setProperty(obj, "sex", "男");
BeanUtils.setProperty(obj, "age", "20");//BeanUtils把字符串的"20"转化为int的20
//BeanUtils把字符串"1993-8-19"转化为Date,通过ConvertUtils.register(new Converter(){})传入一个转化器
//转化器把String类型转化为Date类型
BeanUtils.setProperty(obj, "birthday", "1993-8-19");
System.out.println(obj);
}
@Test
public void test1() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException{
//反射获得Person对象
Object obj = Class.forName("cc.vermouth.beanutil.Person").getConstructor().newInstance();
//把Map集合中的元素填充到bean里面
Map<String, String> map = new HashMap<String, String>();
map.put("name", "value");
map.put("sex", "男");
map.put("age", "20");
map.put("birthday", "1993-8-19");
ConvertUtils.register(new DateLocaleConverter(), Date.class);
BeanUtils.populate(obj, map);
System.out.println(obj);