java反射机制指的是在java运行过程中,对于任意的类都可以知道他的所有属性以及方法,对于任意一个对象都可以任意的调用他的属性和方法,这种动态获取对象信息和动态调用对象方法的功能称为java反射机制。
反射获取类名称
package top.crosssoverjie.study;
public class Reflect {
public static void main(String[] args) {
Class<Reflect> c1 = Reflect.class;
System.out.println(c1.getName());
Reflect r1 = new Reflect() ;
Class<Reflect> c2 = (Class<Reflect>) r1.getClass() ;
System.out.println(c2.getName());
try {
Class<Reflect> c3 = (Class<Reflect>) Class.forName("top.crosssoverjie.study.Reflect");
System.out.println(c3.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
top.crosssoverjie.study.Reflect
top.crosssoverjie.study.Reflect
top.crosssoverjie.study.Reflect
反射获取方法
package top.crosssoverjie.study;
import java.lang.reflect.Method;
public class Person {
private String name="crossover" ;
private String msg ;
public Person(String name, String msg) {
this.name = name;
this.msg = msg;
System.out.println(name+"的描述是"+msg);
}
public Person() {
super();
}
public void say(String name ,String msg){
System.out.println(name+"说:"+msg);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public static void main(String[] args) {
try {
//首先获取类类型
Class c1 = Class.forName("top.crosssoverjie.study.Person") ;
//通过newInstance()方法生成一个实例
Object o1 = c1.newInstance() ;
//获取该类的say方法
Method m1 = c1.getMethod("say", String.class,String.class) ;
//通过invoke方法调用该方法
m1.invoke(o1, "张三","你好啊") ;
Method[] methods = c1.getDeclaredMethods() ;
for(Method m : methods){
System.out.println(m.getName());
}
Method[] methods2 = c1.getMethods() ;
for (Method method : methods2) {
System.out.println(method.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
反射获取属性
package top.crosssoverjie.study;
import java.io.File;
import java.lang.reflect.Field;
public class Reflect {
public static void main(String[] args) {
try {
Class c1 = Class.forName("top.crosssoverjie.study.Person");
Field field = c1.getDeclaredField("name") ;
Object o1 = c1.newInstance() ;
/**由于Person类中的name变量是private修饰的,
* 所以需要手动开启允许访问,是public修饰的就不需要设置了
**/
field.setAccessible(true);
Object name = field.get(o1) ;
System.out.println(name);
} catch (Exception e) {
e.printStackTrace() ;
}
// Class<Reflect> c1 = Reflect.class;
// System.out.println(c1.getName());
//
// Reflect r1 = new Reflect() ;
// Class<Reflect> c2 = (Class<Reflect>) r1.getClass() ;
// System.out.println(c2.getName());
//
// try {
// Class<Reflect> c3=(Class<Reflect>)Class.forName("top.crosssoverjie.study.Reflect");
// System.out.println(c3.getName());
// } catch (ClassNotFoundException e) {
// e.printStackTrace();
// }
}
}
反射获取构造方法
package top.crosssoverjie.study;
import java.io.File;
import java.lang.reflect.Field;
public class Reflect {
public static void main(String[] args) {
try {
Class c1 = Class.forName("top.crosssoverjie.study.Person");
Constructor dc1 = c1.getDeclaredConstructor(String.class,String.class);
dc1.setAccessible(true);
dc1.newInstance("小明","很帅");
} catch (Exception e) {
e.printStackTrace() ;
}
}
}