1.基本概念
A:反射
反射就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法
B:Class类
成员变量 Field
构造方法 Constructor
成员方法 Method
C:获取class文件对象的方式
Object类的getClass()方法
数据类型的静态属性class
Class类中的静态方法
public static Class forName(String className)
注意:开发中一般选用第三种,因为第三种需要的参数是字符串,字符串可以方便的配置到配置文件中
2.获取Class文件的三种方式
A:
Person p = new Person();
Class c1 = p.getClass();
B:
Class c2 = Person.class;
C:
Class c3 = Class.forName("cn.itcast_01.Person");
3.获取构造方法并使用
A:常用功能
public Constructor[] getConstructors():获取所有公共构造方法
public Constructor[] getDeclaredConstructors():获取所有构造方法
public Constructor<T> getConstructor(Class<?>...parameterTypes):获取单个构造方法
参数表示的是:要获取的构造方法的构造参数个数及数据类型的class字节码文件对象
返回值:字节码文件对象
setAccessible(true) 反射对象使用时取消Java语言检查(用于使用私有属性的东西)
public T newInstance(Object...Initargs):通过带参构造方法对象创建对象
B:代码演示
public class ReflectDemo{
public static void main(String[] args) rhrows Exception{
//获取字节码文件对象
Class c = Class.forName("cn.incast_01.Person");
//获取公共带参构造方法
Constructor con1 = c.getConstructor(String.class,int.class,String.class);
//通过公共带参构造方法创建对象
Object obj1 = con1.newInstance("小明",20,"北京");
System.out.println(obj1);
B:代码演示
public class ReflectDemo{
public static void main(String[] args) throws Exception{
//获取字节码文件对象
Class c = Class.forName("cn.itcast_01.Person");
//通过无参构造方法创建对象
Constructor con = c.getConstructor();
Object obj = con.newInstance();
//获取单个公共无参方法并使用
Method m1 = c.getMethod("show");
m1.invoke(obj);
//获取单个公共带参方法并使用
Method m2 = c.getMethod("method",String.class);
m2.invoke(obj,"hello");
//获取返回值类型为String的公共带参构造方法并使用
Method m3 = c.getMethod("getString",String.class,int.class);
Object objString = m3.invoke(obj,"hello",100);
System.out.println(objString);
//获取单个私有无参方法并使用
Method m4 = c.getDeclareMethod("function");
m4.setAccessible(true);
m4.invoke(obj);
}
}
设计模式部分总结
1.简单工厂模式
public abstract class Animal {
public abstract void eat();
}
public class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
}
public class Dog extends Animal{
public void eat(){
System.out.println("狗吃肉");
}
}
public class AnimalFactory{
private AnimalFactory(){
}
public static Animal createAnimal(String type){
if("dog".equals(type)){
return new Dog();
}else if("cat".equals(type)){
return new Cat();
}else{
return null;
}
}
}
public class AnimalDemo{
public static void main(String[] args){
Animal a = AnimalFactory.createAnimal("dog");
a.eat();
a = AnimalFactory.createAnimal("cat");
a.eat();
a = AnimalFactory.ctrateAnimal("pig");
if(a != null){
a.eat();
}else{
System.out.println("暂时不提供这种动物!");
}