美文网首页
Java反射和内省

Java反射和内省

作者: JavaHub | 来源:发表于2018-12-10 15:51 被阅读0次
反射

反射 (Reflection) ,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

内省

通过反射的方式操作JavaBean的属性,一般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法。

  1. 反射

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就是内部类所自动保留的一个指向所在外部类的引用

  1. 内省

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

相关文章

网友评论

      本文标题:Java反射和内省

      本文链接:https://www.haomeiwen.com/subject/ytgrhqtx.html