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);