java反射相关

1.反射机制是什么

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

2.反射机制的作用

java的反射机制就是增加程序的灵活性,避免将程序写死到代码里,
例如: 实例化一个 person()对象, 不使用反射, new person(); 如果想变成 实例化 其他类, 那么必须修改源代码,并重新编译。
      使用反射: class.forName("person").newInstance(); 而且这个类描述可以写到配置文件中,如 **.xml, 这样如果想实例化其他类,只要修改配置文件的"类描述"就可以了,不需要重新修改代码并编译。
 增加程序的灵活性。
如struts中。请求的派发控制。
当请求来到时。struts通过查询配置文件。找到该请求对应的action。已经方法。
然后通过反射实例化action。并调用响应method。
如果不适用反射,那么你就只能写死到代码里了。
所以说,一个灵活,一个不灵活。
很少情况下是非用反射不可的。大多数情况下反射是为了提高程序的灵活性。
因此一般框架中使用较多。因为框架要适用更多的情况。对灵活性要求较高。

3.一些相关方法

getDeclaredField是可以获取一个类的所有字段.
getField只能获取类的public 字段.

getMethods()返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。
getDeclaredMethods()对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,

但不包括继承的方法。当然也包括它所实现接口的方法

GetDeclaredConstructor()返回所有的构造器,包括public和private

GetConstructor()返回public的构造器

getFields()只能获取public的字段,包括父类的。

而getDeclaredFields()只能获取自己声明的各种字段,包括public,protected,private。


4.一些实例

1)通过一个对象获得完整的包名和类名

package reed.sankuai.reflect;

/**
 * Created by fanqunsong on 2017/7/26.
 */
public class TestReflect {

    public static void main(String[] args) {

        TestReflect testReflect = new TestReflect();

        System.out.println(testReflect.getClass().getName());
        
    }
    
}
输出 reed.sankuai.reflect.TestReflect

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2)实例化Class类对象

package reed.sankuai.reflect;

import java.io.Serializable;


/**
 * Created by fanqunsong on 2017/7/26.
 */
public class TestReflectImpl implements Serializable{
    public static void main(String[] args) throws Exception{
        Class<?> class1 = Class.forName("reed.sankuai.reflect.TestReflectImpl");
        Class<?> class2 = new TestReflectImpl().getClass();
        Class<?> class3 = TestReflectImpl.class;
        System.out.println("类名称  "+class1.getName());
        System.out.println("类名称  "+class2.getName());
        System.out.println("类名称  "+class3.getName());
    }
}
类名称  reed.sankuai.reflect.TestReflectImpl
类名称  reed.sankuai.reflect.TestReflectImpl
类名称  reed.sankuai.reflect.TestReflectImpl

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

获取一个对象的父类与实现的接口

package reed.sankuai.reflect;

import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * Created by fanqunsong on 2017/7/26.
 */
public class TestReflectImpl implements Serializable{
 

    public static void main(String[] args) throws Exception{


        Class<?>clazz = Class.forName("reed.sankuai.reflect.TestReflectImpl");

        Class<?>parentClass = clazz.getSuperclass();

        System.out.println("clazz的父亲为"+parentClass.getName());

        Class<?>intes[] = clazz.getInterfaces();

        System.out.println("clazz实现的接口有: ");

        for (int i = 0; i <intes.length ; i++) {
            System.out.println((i+1)+":"+intes[i].getName());
        }

    }
}
clazz的父亲为java.lang.Object
clazz实现的接口有:
1:java.io.Serializable

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

package reed.sankuai.reflect;

import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * Created by fanqunsong on 2017/7/26.
 */
public class TestReflectImpl implements Serializable{
    


    public static void main(String[] args) throws Exception{
        Class<?> class1 = Class.forName("reed.sankuai.reflect.User");
        User user = (User) class1.newInstance();
        user.setAge(20);
        user.setName("Reed");
        System.out.println(user);
        Constructor<?> cons[] = class1.getConstructors();
        for (int i = 0; i <cons.length ; i++) {
            Class<?> clazzs[] = cons[i].getParameterTypes();
            System.out.print("cons["+i+"](");
            for(int j = 0; j < clazzs.length; j++){

                if (j==clazzs.length-1)
                    System.out.print(clazzs[j].getName());
                else
                    System.out.print(clazzs[j].getName()+",");
            }

            System.out.println(")");

        }

    }

class User {

    private int age;
    private String name;
    public User() {
        super();
    }
    public User(String name) {
        super();
        this.name = name;
    }
    public User(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "User [age=" + age + ", name=" + name + "]";
    }
}

输出如下

User [age=20, name=Reed]
cons[0](int,java.lang.String)
cons[1](java.lang.String)
cons[2]()

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

public class SetSomeProperty {
   

    public static void main(String[] args) throws Exception{

        ArrayList<Integer> list = new ArrayList<Integer>();

        Method method = list.getClass().getMethod("add", Object.class);

        method.invoke(list,"Java反射机制实例。");

        System.out.println(list.get(0));
        

    }

}

输出 Java反射机制实例。

----------------------------------------------------------------------------------------------------------------------------------------------------

通过反射机制改变私有属性的值

public class SetSomeProperty {
    private  String property = "reedfan";
    
    public static void main(String[] args) throws Exception{

        Class<?> clazz = Class.forName("reed.sankuai.reflect.SetSomeProperty");

        Object obj = clazz.newInstance();

        Field field = clazz.getDeclaredField("property");

        field.setAccessible(true);

        field.set(obj,"fanqunsong");

        System.out.println(field.get(obj));

    }

输出 fanqunsong

------------------------------------------------------------------------------------------------------------------------

通过反射机制调用某个类的方法

public class TestSomeMethod {

    public static void main(String[] args) throws Exception{

        Class<?>clazz = Class.forName("reed.sankuai.reflect.TestSomeMethod");

        Method method = clazz.getMethod("reflect1");
        method.invoke(clazz.newInstance());
        method = clazz.getMethod("reflect2", int.class,String.class);
        method.invoke(clazz.newInstance(), 26, "范群松");

    }

    public void reflect1(){
        System.out.println("Java 反射机制-调用某个类的方法1");
    }
    public void reflect2(int age,String name){
        System.out.println("Java 反射机制-调用某个类的方法2");
        System.out.println("age-> "+age+ ". name--> "+ name);
    }

}

Java 反射机制-调用某个类的方法1
Java 反射机制-调用某个类的方法2
age-> 26. name--> 范群松

------------------------------------------------------------------------------------------------------------------------------------------------




全部评论

相关推荐

叮咚鸭:群众里面有坏人
点赞 评论 收藏
分享
10-28 14:42
门头沟学院 Java
watermelon1124:因为嵌入式炸了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务