什么反射
什么是反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
通俗来讲就是通过class文件对象,去使用文件中的成员变量,成员方法和构造方法。
反射就是通过类来获取类里面的方法和属性。所以说首先我们需要来解剖一个类,而解剖一个类我们需要获取该类的字节码对象,也就是.class文件对象,一个类在编译的时候都会产生一个.class对象
怎么样获取该类的字节码对象
在这里我们有三种去获取字节码对象
(1)person p=new person();
Class c= person.class;
Class c= p.getclass();
Object类中的getclass方法
(2)
数据类型的静态属性class
(3)Class c=Class.forName("cn.zll.test.person");
class类中的静态方法
package cn.zll.test;
public class person {
private String name;
private int age;
private String address;
public String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "person [address=" + address + ", age=" + age + ", id=" + id
+ ", name=" + name + "]";
}
public person(String name, int age, String address) {
super();
this.name = name;
this.age = age;
this.address = address;
}
public person(){
super();
}
private person(String name){
super();
this.name=name;
}
public person(String name,int age){
super();
this.name=name;
this.age=age;
}
public void show(){
System.out.println("show");
}
private void fun(){
System.out.println("private");
}
public void eat(String str){
System.out.println(str);
}
}
package cn.zll.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class test {
public static void main(String[] args) throws
ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException,
IllegalAccessException, InvocationTargetException, NoSuchFieldException {
//获取字节码文件对象
// Class c=Class.forName(“cn.zll.test.person”);
//获取构造方法(分为几种形式)
//获取所有公共的构造方法
// Constructor[] cons= c.getConstructors();
// for (Constructor constructor : cons) {
//
// System.out.println(constructor);
// public cn.zll.test.person()
// public cn.zll.test.person(java.lang.String,int,java.lang.String)
// }
// //获取所有的构造方法
// Constructor[] Declaredcon=c.getDeclaredConstructors();
// for (Constructor constructor : Declaredcon) {
// System.out.println(constructor);
// public cn.zll.test.person()
// public cn.zll.test.person(java.lang.String,int,java.lang.String)
// private cn.zll.test.person(java.lang.String)
// }
// 一般我们经常用的是某一个构造方法而不是全部,获取单个的构造方法,参数也是class类型,是根据参数的不同来调用不能的构造方法
// 返回的是公共无参构造方法对象,
// Constructor con=c.getConstructor();
// 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
// 他的作用相当于person p= new person()
// Object obj= con.newInstance();
// System.out.println(obj);
// 获取有参公共的构造方法
// Constructor con=c.getConstructor(String.class,int.class);
// Object obj= con.newInstance(“xx”,90);
// System.out.println(obj);
// person [address=null, age=90, name=xx]
// 获取有参私有构造方法
// IllegalAccessException:非法访问
// Constructor con=c.getDeclaredConstructor(String.class);
// 设置为true表示的取消java语言检查功能
// con.setAccessible(true);
// Object obj= con.newInstance(“xx”);
// System.out.println(obj);
person p=new person();
//Class c=p.getClass();
Class c= person.class;
System.out.println(c);
//反射成员变量并且使用
//获取.class的对象
//Class c=Class.forName("cn.zll.test.person");
//获取所有的变量
// Field[] f= c.getFields();
// for (Field field : f) {
// System.out.println(field);
// public java.lang.String cn.zll.test.person.id
// }
//获取私有变量
// Field [] fs=c.getDeclaredFields();
// for (Field field : fs) {
// System.out.println(field);
// private java.lang.String cn.zll.test.person.name
// private int cn.zll.test.person.age
// private java.lang.String cn.zll.test.person.address
// }
//获取某一个公有变量 ,获取filed对象
// Field field = c.getField(“id”);
//使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例
Constructor con=c.getConstructor();
Object obj= con.newInstance();
//将指定对象变量上此field对象表示的字段设置为指定的值。
//给obj对象上的address字段设置的值为广东省
// field.set(obj, “123”);
// System.out.println(obj);
// person [address=null, age=0, id=123, name=null]
//获取某一个私有变量
// Field field=c.getDeclaredField(“address”);
// field.setAccessible(true);
// field.set(obj, “广东”);
// System.out.println(obj);
//person [address=广东, age=0, id=null, name=null]
//通过反射获取成员方法
//获取自己和父类的公有方法
// Method[] method= c.getMethods();
// for (Method method2 : method) {
// System.out.println(method2);
// public java.lang.String cn.zll.test.person.getAddress()
// public java.lang.String cn.zll.test.person.toString()
// public java.lang.String cn.zll.test.person.getName()
// public java.lang.String cn.zll.test.person.getId()
// public void cn.zll.test.person.setName(java.lang.String)
// public void cn.zll.test.person.setId(java.lang.String)
// public int cn.zll.test.person.getAge()
// public void cn.zll.test.person.setAge(int)
// public void cn.zll.test.person.setAddress(java.lang.String)
// public final void java.lang.Object.wait() throws java.lang.InterruptedException
// public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
// public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
// public native int java.lang.Object.hashCode()
// public final native java.lang.Class java.lang.Object.getClass()
// public boolean java.lang.Object.equals(java.lang.Object)
// public final native void java.lang.Object.notify()
// public final native void java.lang.Object.notifyAll()
// }
//获取自己的公共方法
// Method[] method =c.getDeclaredMethods();
// for (Method method2 : method) {
// System.out.println(method2);
// public java.lang.String cn.zll.test.person.getAddress()
// public java.lang.String cn.zll.test.person.toString()
// public java.lang.String cn.zll.test.person.getName()
// public java.lang.String cn.zll.test.person.getId()
// public void cn.zll.test.person.setName(java.lang.String)
// public void cn.zll.test.person.setId(java.lang.String)
// public int cn.zll.test.person.getAge()
// public void cn.zll.test.person.setAge(int)
// public void cn.zll.test.person.setAddress(java.lang.String)
// }
//获取自己的某一个方法
//无参方法
// Method method= c.getMethod(“show”);
// method.invoke(obj);
// System.out.println();
//有参方法
// Method method=c.getMethod(“eat”, String.class);
// method.invoke(obj, “猫吃鱼”);
//猫吃鱼
//获取私有方法
// Method method=c.getDeclaredMethod(“fun”);
// method.setAccessible(true);
// method.invoke(obj);
}
}
“`