反射
反射 (Reflection) ,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
内省
通过反射的方式操作JavaBean的属性,一般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法。
- 反射
1.1 getClass
String str = "abc";
Class c1 = str.getClass();
Class c2 = c1.getSuperclass();
System.out.println(c1);
System.out.println(c2);
结果:
class java.lang.String
class java.lang.Object
1.2 Class.forName()
Class c1 = Class.forName("java.lang.String")
Class c2 = c1.getSuperclass();
System.out.println(c1);
System.out.println(c2);
结果:
class java.lang.String
class java.lang.Object
1.3 .class
Class c1 = String.class;
Class c2 = int.class;
Class c3 = String[].class;
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
结果:
class java.lang.String
int
class [Ljava.lang.String;
1.4 wrapper classes的TYPE 语法
//包装类型
Class c1 = Boolean.TYPE;
Class c2 = Integer.TYPE;
Class c3 = Character.TYPE;
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
结果:
boolean
int
char
1.5 Package、Method、Constructor、Field的api
package com.meek.reflect;
import java.util.Objects;
public class Test {
public static String version = "1";
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
//包装类型
Class c1 = Point.class;
System.out.println("package: " + c1.getPackage());
System.out.println("name: " + c1.getName());
System.out.println("outer class: " + c1.getDeclaringClass());
for (int i = 0; i < c1.getDeclaredConstructors().length; i++) {
System.out.println("constructor"+i+": " + c1.getDeclaredConstructors()[i].getName());
}
for (int i = 0; i < c1.getDeclaredMethods().length; i++) {
System.out.println("method"+i+": " + c1.getDeclaredMethods()[i].getName());
}
for (int i = 0; i < c1.getDeclaredFields().length; i++) {
System.out.println("field"+i+": " + c1.getDeclaredFields()[i]);
}
}
class Point{
private double lon;
private double lat;
private String loctime;
Point(){}
Point(double lon,double lat){
this.lat = lat;
this.lon = lon;
}
Point(double lon,double lat,String loctime){
this.lat = lat;
this.lon = lon;
this.loctime = loctime;
}
public double getLon() {
return lon;
}
public void setLon(double lon) {
this.lon = lon;
}
public double getLat() {
return lat;
}
public void setLat(double lat) {
this.lat = lat;
}
public String getLoctime() {
return loctime;
}
public void setLoctime(String loctime) {
this.loctime = loctime;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Point point = (Point) o;
return Double.compare(point.lon, lon) == 0 &&
Double.compare(point.lat, lat) == 0 &&
Objects.equals(loctime, point.loctime);
}
@Override
public int hashCode() {
return Objects.hash(lon, lat, loctime);
}
@Override
public String toString() {
return "Point{" +
"lon=" + lon +
", lat=" + lat +
", loctime='" + loctime + '\'' +
'}';
}
}
}
结果:
package: package com.meek.reflect
name: com.meek.reflect.Test$Point
outer class: class com.meek.reflect.Test
constructor0: com.meek.reflect.Test$Point
constructor1: com.meek.reflect.Test$Point
constructor2: com.meek.reflect.Test$Point
method0: getLat
method1: setLat
method2: getLoctime
method3: setLoctime
method4: getLon
method5: setLon
method6: equals
method7: toString
method8: hashCode
field0: private double com.meek.reflect.Test$Point.lon
field1: private double com.meek.reflect.Test$Point.lat
field2: private java.lang.String com.meek.reflect.Test$Point.loctime
field3: final com.meek.reflect.Test com.meek.reflect.Test$Point.this$0//this$0就是内部类所自动保留的一个指向所在外部类的引用
- 内省
package com.meek.reflect;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Objects;
public class MyTest {
public static void main(String[] args) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
Point point = new Point();
BeanInfo beanInfo = Introspector.getBeanInfo(point.getClass(), Object.class);
PropertyDescriptor[] p = beanInfo.getPropertyDescriptors();
for(int i=0;i<p.length;i++){
System.out.println(p[i].getName()+"="+
p[i].getReadMethod().invoke(point,(Object[])null));
}
PropertyDescriptor pd = new PropertyDescriptor("lon",Point.class);
Method writeMethod = pd.getWriteMethod();
writeMethod.invoke(point,135.6819);
Method readMethod = pd.getReadMethod();
Object invoke = readMethod.invoke(point, null);
System.out.println(invoke);
}
static class Point{
private double lon;
private double lat;
private String loctime;
Point(){}
Point(double lon,double lat){
this.lat = lat;
this.lon = lon;
}
Point(double lon,double lat,String loctime){
this.lat = lat;
this.lon = lon;
this.loctime = loctime;
}
public double getLon() {
return lon;
}
public void setLon(double lon) {
this.lon = lon;
}
public double getLat() {
return lat;
}
public void setLat(double lat) {
this.lat = lat;
}
public String getLoctime() {
return loctime;
}
public void setLoctime(String loctime) {
this.loctime = loctime;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Point point = (Point) o;
return Double.compare(point.lon, lon) == 0 &&
Double.compare(point.lat, lat) == 0 &&
Objects.equals(loctime, point.loctime);
}
@Override
public int hashCode() {
return Objects.hash(lon, lat, loctime);
}
@Override
public String toString() {
return "Point{" +
"lon=" + lon +
", lat=" + lat +
", loctime='" + loctime + '\'' +
'}';
}
}
}
结果:
lat=0.0
loctime=null
lon=0.0
135.6819
网友评论