获取类对象
Person zhangsan=new Person();
Class<?> class1=zhangsan.getClass();
System.out.println(class1.hashCode());
Class<?> class2=Person.class;
System.out.println(class2.hashCode());
Class<?> class3=Class.forName("com.qf.chap17_1.Person");
System.out.println(class3.hashCode());
使用反射获取类的名字、包名、父类、接口
Class<?> class1=Class.forName("com.qf.chap17_1.Person");
System.out.println(class1.getName());
System.out.println(class1.getPackage().getName());
System.out.println(class1.getSuperclass().getName());
Class<?>[] classes=class1.getInterfaces();
System.out.println(Arrays.toString(classes));
System.out.println(class1.getSimpleName());
System.out.println(class1.getTypeName());
使用反射获取类的构造方法,并创建对象
Class<?> class1=Class.forName("com.qf.chap17_1.Person");
Constructor<?>[] cons=class1.getConstructors();
for (Constructor<?> con : cons) {
System.out.println(con.toString());
}
Constructor<?> con=class1.getConstructor();
Person zhangsan=(Person)con.newInstance();
Person lisi=(Person)con.newInstance();
System.out.println(zhangsan.toString());
System.out.println(lisi.toString());
Person wangwu=(Person)class1.newInstance();
System.out.println(wangwu.toString());
Constructor<?> con2=class1.getConstructor(String.class,int.class);
Person xiaoli=(Person)con2.newInstance("晓丽",20);
System.out.println(xiaoli.toString());
使用反射获取类中的方法,并调用方法
Class<?> class1=Class.forName("com.qf.chap17_1.Person");
Method[] methods=class1.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.toString());
}
Method eatMethod=class1.getMethod("eat");
Person zhangsan=(Person)class1.newInstance();
eatMethod.invoke(zhangsan);
System.out.println("------------------");
Method toStringMethod=class1.getMethod("toString");
Object result=toStringMethod.invoke(zhangsan);
System.out.println(result);
System.out.println("-------------------");
Method eatMethod2=class1.getMethod("eat", String.class);
eatMethod2.invoke(zhangsan, "鸡腿");
Method privateMethod=class1.getDeclaredMethod("privateMethod");
privateMethod.setAccessible(true);
privateMethod.invoke(zhangsan);
Method staticMethod=class1.getMethod("staticMethod");
staticMethod.invoke(null);
---------------------------------------------------------
public static Object invokeAny(Object obj,String methodName,Class<?>[] types,Object...args) throws Exception {
Class<?> class1=obj.getClass();
Method method=class1.getMethod(methodName, types);
return method.invoke(obj, args);
}
使用反射获取类中的属性
Class<?> class1=Class.forName("com.qf.chap17_1.Person");
Field[] fields=class1.getDeclaredFields();
System.out.println(fields.length);
for (Field field : fields) {
System.out.println(field.toString());
}
Field namefield=class1.getDeclaredField("name");
namefield.setAccessible(true);
Person zhangsan=(Person)class1.newInstance();
namefield.set(zhangsan, "张三");
System.out.println(namefield.get(zhangsan));
工厂设计模式
单例模式
public class SingleTon{
private static final SingleTon instance=new SingleTon();
private SingleTon(){}
public static SingleTon getInstance(){
return instance;
}
}
public class SingleTon2{
private static SingleTon2 instance = null;
private SingleTon2(){}
public static SingleTon2 getInstance(){
if(instance == null){
instance = new SingleTon2();
}
return instance;
}
}
------------------------------------------------
改进后的懒汉式,线程安全
public class SingleTon2 {
private static SingleTon2 instance = null;
private SingleTon2() {
}
public static SingleTon2 getInstance() {
if(instance==null) {
synchronized (SingleTon2.class) {
if (instance == null) {
instance = new SingleTon2();
}
}
}
return instance;
}
}
public class SingleTon3{
private SingleTon3(){}
private static class Holder{
static SingleTon3 instance = new SingleTon3();
}
public staic SingleTon3 getInstance(){
return Holder.instance;
}
}
枚举
- 枚举中必须要包含枚举常量,也可以包含属性、方法、私有构造方法
- 枚举常量必须在前面,多个常量之间使用逗号隔开,最后分号可写可不写
注解Annotation
- 定义注解使用@interface关键字,注解中只能包含属性
- 注解属性类型
- String类型
- 基本数据类型
- Class类型
- 枚举类型
- 注解类型
- 以上类型的一维数组
- 元注解:用来描述注解的注解
- @Retention:用于指定注解可以保留的域。
- RetentionPolicy.CLASS:注解记录在class文件中,运行java程序时,JVM不会保留,此为默认值。
- RetentionPolicy.RUNTIME:注解记录在class文件中,运行java程序时,JVM会保留,程序可通过反射获取该注解
- RetentionPolicy.SOURCE:编译时直接丢弃这种策略的注解
- @Target:指定注解用于修饰类的哪个成员。
@Retention(value=RetentionPolicy.RUNTIME)
@Target(value= {ElementType.METHOD})
public @interface PersonInfo {
String name();
int age();
String sex();
}
----------------------------------------------------------------------------
@PersonInfo(name="小岳岳",age=30,sex="男")
public void show(String name,int age,String sex) {
System.out.println(name+"==="+age+"===="+sex);
}
----------------------------------------------------------------------------
Class<?> class1=Class.forName("com.qf.chap17_5.Person");
Method method=class1.getMethod("show", String.class,int.class,String.class);
PersonInfo personInfo=method.getAnnotation(PersonInfo.class);
System.out.println(personInfo.name());
System.out.println(personInfo.age());
System.out.println(personInfo.sex());
Person yueyue=(Person)class1.newInstance();
method.invoke(yueyue, personInfo.name(),personInfo.age(),personInfo.sex());