未分类
2020-09-08 15:48:48
1822677238@qq.com
手机扫码查看
反射
什么是类对象?
类的对象:基于某个类 new 出来的对象,也成为实例对象。
类对象:类加载的产物,封装了一个类的所有信息(类名,父类,接口,属性,方法,构造方法)。
获取类对象
通过类的对象,获取类对象
Student s=new Student();
Class c=s.getClass();
通过类名获取类对象
Class c=类名.class
通过静态方法获取类对象
Class c=Class.forName(“包名.类名”)
常用方法
public String getName()
public Package getPackage()
public Class<? super T> getSuperclass()
public Class<?>[] getInterfaces()
public field[] getFields()
public Method[] getMethods()
public Constructor<?>[] getConstructors()
public T newInstance()
工厂设计模式
开发中有一个非常重要的原则“开闭原则”,对拓展开放,对修改关闭。
工厂模式主要负责对象创建的问题。
可通过反射进行工厂模式的设计,完成动态的对象创建。
工厂模式获取类对象
import java.io.*;
public class demos{
public static void main(String[] args) {
BufferedReader br=null;
try{
br=new BufferedReader(new FileReader(new File("app\\config.txt")));
String name = br.readLine();
Object o=createClass(name);
System.out.println(o);
}catch (Exception e){}
}
public static Object createClass(String str){
Class c=null;
try{
c=Class.forName(str);
return c.newInstance();
}catch (Exception e){}
return null;
}
}
class Teacher{}
通过反射实现通用编程(调用任何方法)
import java.lang.reflect.Method;
import java.util.Properties;
public class demos{
public static void main(String[] args) {
Properties properties=new Properties();
invokeAny(properties,"setProperty",new Class[]{String.class,String.class},"CN","中国");
System.out.println(properties.getProperty("CN"));
}
public static void invokeAny(Object obj,String methodName,Class[] types,Object... o){
Class c=null;
try{
c=obj.getClass();
Method method = c.getDeclaredMethod(methodName, types);
method.invoke(obj,o);
}catch (Exception e){}
}
}
import java.lang.reflect.Method;
public class demos{
public static void main(String[] args) {
invokeAny(new Teacher(),"tech",new Class[]{String.class,int.class},"tom",22);
}
public static void invokeAny(Object obj,String methodName,Class[] types,Object... args){
Class c=null;
try{
c=obj.getClass();
Method m = c.getDeclaredMethod(methodName, types);
m.setAccessible(true);//注意:反射一种java的底层技术,可以无视封装
m.invoke(obj,args);
}catch (Exception e){}
}
}
class Teacher{
private String name;
private Integer age;
private Double salary;
public Teacher() {
}
public Teacher(String name, Integer age, Double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
public void tech(String name,int age){
System.out.println(name+age);
}
}



发表回复