对JavaBean的简单内省操作
1、javaBean是一种特殊的java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则
2、如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值的对象(ValueObject,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,大家觉得这些方法的名称交涉呢么好?JavaBean的属性是根据其中的setter和gettter方法来访问的,而不是根据其中的成员变量。如果方法名为setld,中文的意思即为设置id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余的部分就是属性名,如果剩余部分的第首字母是小写,则把剩余的部分的首字母改成小的。
案例代码如下:
import java.beans.*;使用BeanUtils工具包操作JavaBean
import java.lang.reflect.*;
public class IntroSpectorTest {
public static void main(String[] args) throws Exception {
ReflectPoint pt1 = new ReflectPoint(3,5);
System.out.println(pt1.getX());
String propertyName = "x";
Object retVal = getProperty(pt1, propertyName);
System.out.println(retVal);
Object value = 7;
setProperty(pt1, propertyName, value);
System.out.println(retVal);
}
private static void setProperty(ReflectPoint pt1, String propertyName,
Object value) throws IntrospectionException,
IllegalAccessException, InvocationTargetException {
PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
Method methodSetX = pd.getWriteMethod();
methodSetX.invoke(pt1,value);
}
//这个代码不好
private static Object getProperty(ReflectPoint pt1, String propertyName)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
Object retVal = null;
for(PropertyDescriptor pd : pds){
if(pd.getName().equals(propertyName)){
Method methodGetX = pd.getReadMethod();
retVal = methodGetX.invoke(pt1);
break;
}
}
return retVal;
}
}
使用 BeanUtils 库,要加载 logging 库,因为 BeanUtils 要用到 logging ,
:声明bean为public class xxx,必须是public,我用默认类型(class xxx)都不行、
import java.beans.*;
import java.lang.reflect.*;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
public class IntroSpectorTest {
public static void main(String[] args) throws Exception {
ReflectPoint pt1 = new ReflectPoint(3,5);
System.out.println(pt1.getX());
String propertyName = "x";
Object retVal = getProperty(pt1, propertyName);
System.out.println(retVal);
Object value = 7;
setProperty(pt1, propertyName, value);
System.out.println(retVal);
System.out.println("------------------");
//:声明bean为public class xxx,必须是public,我用默认类型(class xxx)都不行
System.out.println(BeanUtils.getProperty(pt1,"x"));
System.out.println(BeanUtils.getProperty(pt1,"x").getClass().getName());//返回类型为string,也可传入string,他自动转
BeanUtils.setProperty(pt1,"x",9);
System.out.println(BeanUtils.getProperty(pt1,"x"));
System.out.println("------------------");
BeanUtils.setProperty(pt1,"birthday.time","999999999999");//birthday 为date类型,有个setTime()方法,util支持级联操作,不过该Date对象得先new Date初始化
System.out.println(BeanUtils.getProperty(pt1,"birthday"));
PropertyUtils.setProperty(pt1, "x", 9);//必须传入相应的类型,
}
private static void setProperty(ReflectPoint pt1, String propertyName,
Object value) throws IntrospectionException,
IllegalAccessException, InvocationTargetException {
PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
Method methodSetX = pd.getWriteMethod();
methodSetX.invoke(pt1,value);
}
//这个代码不好
private static Object getProperty(ReflectPoint pt1, String propertyName)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
Object retVal = null;
for(PropertyDescriptor pd : pds){
if(pd.getName().equals(propertyName)){
Method methodGetX = pd.getReadMethod();
retVal = methodGetX.invoke(pt1);
break;
}
}
return retVal;
}
}
了解和入门注解的应用
@ItcastAnnotation
public class AnnotationTest {
@SuppressWarnings("deprecation")//压缩警告,告诉程序说,我知道已经过时了,不提示
public static void main(String[] args) {
System.runFinalizersOnExit(true);
sayHello();
if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){//判断是否是注解
//获取注解对象
ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
System.out.println(annotation);
}
}
@Deprecated//表明该方法已过时
public static void sayHello(){
System.out.println("hi,传智播客");
}
@Override//表明是覆盖方法,如果写错会提示
public String toString(){
return null;
}
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)//有的注解编译器会过滤掉,写这个注解意思是将注解保留
//@Target(ElementType.METHOD)//表示只能放在方法上
@Target({ElementType.METHOD,ElementType.TYPE})//ElementType.TYPE表示可以加载类,接口枚举上
public @interface ItcastAnnotation {
}
为注解增加各种属性
@ItcastAnnotation(color="red", value = "abc", arrayArray = { 1,2 })//使用注解的属性,当数组属性只有一个元素时,可以不写大括号
//@ItcastAnnotation("abc")//使用注解的属性,当只有value属性时,可以直接写值
public class AnnotationTest {
@SuppressWarnings("deprecation")//压缩警告,告诉程序说,我知道已经过时了,不提示
public static void main(String[] args) {
System.runFinalizersOnExit(true);
sayHello();
if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){//判断是否是注解
//获取注解对象
ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
System.out.println(annotation);
System.out.println(annotation.color());//s使用注解的属性,调用方法
System.out.println(annotation.arrayArray().length);//s使用注解的属性,调用方法,数组属性不能转换为list打印出来
}
}
@Deprecated//表明该方法已过时
public static void sayHello(){
System.out.println("hi,传智播客");
}
@Override//表明是覆盖方法,如果写错会提示
public String toString(){
return null;
}
}
入门泛型的基本应用
37_黑马程序员_张孝祥_Java基础加强_泛型的内部原理及更深应用
ArrayList<String> 和ArrayList<Integer> 都是同一类型class
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
public class GenericTest {
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
ArrayList<Integer> collecton = new ArrayList<Integer>();//类型的限定在编译后会去掉
//collecton.add("abc");会报错
//往Integer中存String
collecton.getClass().getMethod("add", Object.class).invoke(collecton, "abc");
System.out.println(collecton.get(0));
}
}
泛型集合的综合应用案例