这一块的内容主要是有关Java中反射的内容。
反射
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制
简言化之: 反射就是:通过class文件对象去使用该文件中的成员变量,构造方法,成员方法
之前我们写了很多类Java文件,再去实例化的时候,直接new出来 比如:Person p = new Person();
总归还是需要一个class文件 也就是需要得到class文件对象,其实也就是获得该class类的对象
class类: 成员变量:Field 构造方法:Constructor 成员方法:Method
如何获取class文件对象 1、通过Object中的getClass()方法返回此Object的运行时的类 2、数据类型的静态属性class 3、class类中的静态方法 static Class<?> forName(String className) 返回与给定字符串名称的类或接口相关联的 类对象。
我们应该使用哪一种 1、如果是我们自己学习或者自己写一些案例,哪一种都可以,第二种比较方便 2、开发中,使用第三种 因为第三种传入的是一个字符串,而不是一个具体的类型 之后,会通过配置文件传入,比较方便
三种方式获取class文件对象
public static void main(String[] args) throws ClassNotFoundException {
Person p1 = new Person();
Class<? extends Person> c1 = p1.getClass();
Person p2 = new Person();
Class<? extends Person> c2 = p2.getClass();
System.out.println(p1==p2);
System.out.println(c1==c2);
Class<Person> pc = Person.class;
System.out.println(c1==pc);
System.out.println(c2==pc);
Class<?> c3 = Class.forName("com.bigdata.shujia27.Person");
System.out.println(c1==c3);
}
通过反射获取class文件对象中的无参构造方法并使用
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> c = Class.forName("com.bigdata.shujia27.Person");
Constructor<?>[] cons = c.getConstructors();
for(Constructor con:cons){
System.out.println(con);
}
System.out.println("**********************");
Constructor<?>[] decons = c.getDeclaredConstructors();
for(Constructor decon:decons){
System.out.println(decon);
}
System.out.println("**********************");
Constructor<?> con = c.getConstructor();
System.out.println(con);
System.out.println("**********************");
Object obj = con.newInstance();
System.out.println(obj);
Person p = (Person) obj;
System.out.println(p);
}
通过反射获取class文件对象中的带参构造方法并使用
public class ReflexDemo3 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> c = Class.forName("com.bigdata.shujia27.Person");
Constructor<?> con = c.getConstructor(String.class, int.class, String.class);
Object obj = con.newInstance("zhangsan", 21, "zhangsanjia");
con.setAccessible(true);
System.out.println(obj);
}
}
通过反射获取class文件对象中的成员变量并使用
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
Class<?> c = Class.forName("com.bigdata.shujia27.Person");
Field[] fields = c.getFields();
for(Field field : fields){
System.out.println(field);
}
System.out.println("********************");
Field[] defields = c.getDeclaredFields();
for(Field defield:defields){
System.out.println(defield);
}
System.out.println("********************");
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
System.out.println(obj);
Field address = c.getField("address");
Field age = c.getDeclaredField("age");
Field name = c.getDeclaredField("name");
address.set(obj,"合肥");
age.setAccessible(true);
age.set(obj,21);
name.setAccessible(true);
name.set(obj,"zhangsna");
System.out.println(obj);
}
通过反射获取class文件对象中的成员方法并使用
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> c = Class.forName("com.bigdata.shujia27.Person");
Method[] methods = c.getMethods();
for(Method method : methods){
System.out.println(method);
}
System.out.println("***********************");
Method[] demethods = c.getDeclaredMethods();
for(Method demethod : demethods){
System.out.println(demethod);
}
System.out.println("***********************");
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
Method show = c.getMethod("show");
System.out.println(show);
Object o1 = show.invoke(obj);
System.out.println(o1);
System.out.println("***********************");
Method getString = c.getMethod("getString", String.class, int.class);
Object o2 = getString.invoke(obj, "zhangsan", 21);
System.out.println(o2);
System.out.println("***********************");
Method fun = c.getDeclaredMethod("fun");
fun.setAccessible(true);
fun.invoke(obj);
}
通过配置文件来操作对象
配置文件:configure.txt className=com.bigdata.shujia27.Person methodName=study
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
FileReader fr = new FileReader("D:\\BigDaTa\\JavaProject\\src\\com\\bigdata\\shujia27\\configure.txt");
prop.load(fr);
fr.close();
String className = prop.getProperty("className");
System.out.println(className);
String methodName = prop.getProperty("methodName");
System.out.println(methodName);
Class<?> c = Class.forName(className);
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
Method method = c.getMethod(methodName);
method.invoke(obj);
}
给一个ArrayList的对象,想在这个集合中添加一个字符串数据,如何实现
public class ArrayListDemo {
public static void main(String[] args) throws Exception{
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(12);
list.add(34);
list.add(56);
Class<? extends ArrayList> c = list.getClass();
Method add = c.getMethod("add", Object.class);
add.invoke(list,"hello");
add.invoke(list,"world");
add.invoke(list,12);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
Object next = (Object)iterator.next();
System.out.println(next);
}
}
}
感谢阅读,我是啊帅和和,一位大数据专业即将大四学生,祝你快乐。
|