----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
JavaBean
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。
JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,至于你把它存到哪个变量上,则不用管。如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,也不用管。去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。
简单内省:
public class ReflectField {
public static void main(String[] args) throws Exception {
Student stu = new Student(12, "张京辉");
String propertyName = "age";
// 声明PropertyDescriptor类(属性描描述类),获取信息
PropertyDescriptor pd1 = new PropertyDescriptor(propertyName, stu
.getClass());
// 获取读取数据的方法
Method readMethod = pd1.getReadMethod();
// 读取age
Object retVal = readMethod.invoke(stu);
System.out.println(retVal);
PropertyDescriptor pd2 = new PropertyDescriptor(propertyName, stu
.getClass());
// 获取写入数据的方法
Method writeMethod = pd1.getWriteMethod();
// 设置age值
Object value = 24;
// 对age重新赋值
writeMethod.invoke(stu, value);
System.out.println(stu.getAge());
}
}
class Student {
private int age;
public int score;
public String name;
public String grade;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
注解
1、注解是Java1.5的新特性。
2、一个注解就是一个类,使用注解,就相当于创建了一个对象。
3、注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记。以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
示例:
//加入自定义注解
@MyAnnotation
public class AnnotationTest extends Father {
// @SuppressWarnings("deprecation"),此注解的作用就是告诉编译器,
// 虽然我用的方法过时了,但是我还是坚持要用,你就不要再提示了。
@SuppressWarnings("deprecation")
public static void main(String[] args) {
// 当执行一切过时的方法时,eclipse会自动划线
// 提示开发人员调用的方法已经过时,建议不要调用
System.runFinalizersOnExit(true);
String str = "过时了";
sop(str);
// 如果存在该元素的指定类型的注释,则返回这些注释
if (AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation itheimaAnnotation = AnnotationTest.class
.getAnnotation(MyAnnotation.class);
System.out.println(itheimaAnnotation);
}
}
// sop方法可以通过@Deprecated注解标记为过时
@Deprecated
private static void sop(Object str) {
System.out.println(str);
}
// 表示一个方法声明打算重写超类中的另一个方法声明
@Override
public void sayHello(String ss) {
System.out.println(ss);
}
}
class Father {
public void sayHello(String s) {
System.out.println(s);
}
}
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//自定义注解
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
输出:
过时了
@GaoXin.MyAnnotation()
类加载器
Java虚拟机中可以安装多个类加载器,系统默认有三个主要的类加载器,每个类加载器负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader。
类加载器也是Java类,因此java类的类加载器本身也要被其他的类加载器加载,显然必须有第一个类加载器不是java类,它就是BootStrap类加载器。
类加载器的委托机制
当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?
首先当前线程的类加载器去加载线程中的第一个类。
如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
示例:
public class ClassLoader {
public static void main(String[] args) {
//ClassLoader类是由AppClassLoader类加载器加载的,System类是由BootStrap类加载器加载的
System.out.println(ClassLoader.class.getClassLoader().getClass().getName());
System. out.println(System.class.getClassLoader());
//AppClassLoader类加载器的父级别类加载器是ExtClassLoader类加载器
System.out.println(ClassLoader.class.getClassLoader().getParent());
//ExtClassLoader类加载器的父级别类加载器是BootStrap类加载器
System.out.println(ClassLoader.class.getClassLoader().getParent().getParent());
}
}
输出结果:
sun.misc.Launcher$AppClassLoader
null
sun.misc.Launcher$ExtClassLoader@37b90b39
null