一、概述
java反射不仅仅只用于对象的实例化,更多的情况下用于类的组成结构操作。类的基本组成结构:父类(父接口)、包、属性、方法(构造方法、普通方法)
建立如下结构程序:
package com.cz.parent; public interface IMessage { void send(); }
package com.cz.parent; public interface IService { void service(); }
public abstract class Study { }
package com.cz.entity; import com.cz.parent.IMessage; import com.cz.parent.IService; import com.cz.parent.Study; public class Person extends Study implements IMessage,IService { private String name; private int age; public Person(){ System.out.println("这是无参构造方法!!"); } public Person(String name,int age){ this.name = name; this.age = age; } public String toString(){ return "名字:"+this.name+"年龄:"+this.age; } @Override public void send() { System.out.println("消息发送"); } @Override public void service() { System.out.println("提供服务"); } }
二、获取父类信息
2.1 获取包名
public class Test { public static void main(String[] args) { Class<?> cls = Person.class; Package pac = cls.getPackage(); System.out.println(pac.getName()); } }
输出结果:
2.2 获取父类信息
public class Test { public static void main(String[] args) { Class<?> cls = Person.class; Class<?> superclass = cls.getSuperclass(); System.out.println(superclass.getName()); } }
输出结果:
2.3 获取父接口信息
public class Test { public static void main(String[] args) { Class<?> cls = Person.class; Class<?>[] interfaces = cls.getInterfaces(); for (Class<?> temp: interfaces ) { System.out.println(temp.getName()); } } }
输出结果:
三、获取构造方法
3.1 获取所有构造方法
public class Test { public static void main(String[] args) { Class<?> cls = Person.class; Constructor<?>[] constructors = cls.getConstructors(); //Constructor<?>[] constructors = cls.getDeclaredConstructors(); //这种方式也可 for (Constructor<?> temp: constructors ) { System.out.println(temp); } } }
输出结果:
3.2 通过参数获取指定构造器
public class Test { public static void main(String[] args) { Class<?> cls = Person.class; try { Constructor<?> constructor = cls.getConstructor(String.class,int.class); Object obj = constructor.newInstance("张三",18); System.out.println(obj); } catch (Exception e) { e.printStackTrace(); } } }
运行结果:
四、反射获取普通方法
4.1 获取所有方法(包括父类)
public class Test { public static void main(String[] args) { Class<?> cls = Person.class; Method[] methods = cls.getMethods(); for (Method temp: methods ) { System.out.println(temp); } } }
运行结果:
4.2 获取本类的所有方法
public class Test { public static void main(String[] args) { Class<?> cls = Person.class; Method[] methods = cls.getDeclaredMethods(); for (Method temp: methods ) { System.out.println(temp); } } }
运行结果:
4.3 根据方法名获取特定的方法
public class Test { public static void main(String[] args) { Class<?> cls = Person.class; try { Method methods = cls.getMethod("toString"); System.out.println(methods); } catch (NoSuchMethodException e) { e.printStackTrace(); } } }
运行结果:
4.4 如何调用类中的setter与getter方法?
public class Test { public static void main(String[] args) throws Exception { Class<?> cls = Class.forName("com.cz.entity.Person");//反射(根据字符串类名) String value ="张三";//要设置的属性内容 //任何情况下如果要保存类中的属相或者调用类中的方法都必须保证存在有实例化对象,既然不允许导入包,那就反射实例化 Object obj = cls.getDeclaredConstructor().newInstance();//调用无参构造实例化 //如果想要进行方法的调用,那么一定得获取方法的名称 String setMethodName = "setName";//方法名称 Method method = cls.getDeclaredMethod(setMethodName,String.class);//获取指定的方法 method.invoke(obj,value);//等价于: Person对象的 setName(value) String getMethodName = "getName"; Method method1 = cls.getDeclaredMethod(getMethodName); System.out.println(method1.invoke(obj)); //等价于: Person对象的 getName() } }
注:初学者,写的不好请见谅,如有相关问题记得私信我