java反射的使用

    java中的反射经常被用在一些框架搭建上,他能够让我们很方便的对自己未来将使用的类,方法和变量进行访问。个人觉得有种黑客的味道在里面。当我们知道一个类的类名后,我们基本上可以使用反射的到它的一切。包括他的private的方法和变量等(当然访问他们的使用需要使用的是getDeclared***(**))。另外,据说反射是比较消耗性能的,故而出了框架搭建外,一般用得不多。

   1.基本常用的反射使用。

      Class.forName("****");这个语句是java连接数据库的第一个语句。

   2.通过构造器创建反射类实例。

      首先,获取反射类的构造器。   构造器类.class.get构造器等方法。

      然后,我们再获取构造器需要的参数类型。

      最后,我们再利用newinstance方法来构建其实例。

   3.利用反射来获取一个类的方法或者属性。

      需要注意的是访问private的方法和变量,使用需要使用的是getDeclared***(**)。变量我们还需要用.setAccessible(true).

    具体实例如下:

       有了如下的代码,只要有个类名的字符串,你就可以获得它这个类的一切东西,包括私有属性和方法。


   //リフレクトで、クラスのconstructorを取得し、情報も取得する。
   Class reflectBeanClass = Class.forName("com.cy.ReflectBean");
   Constructor[] constructors = reflectBeanClass.getConstructors();
   for(Constructor cons : constructors){
                //constructorのParameterTypes
    Class[] parClasses = cons.getParameterTypes();
    int paramLen = parClasses.length;
    if(parClasses != null && paramLen > 0){
     for(Class parClass : parClasses){
      System.out.println(parClass.getName());
     }
    }
    Object objectClass = null;
    switch(paramLen){
       case 0 :
        objectClass = cons.newInstance(null);
        System.out.println("test2 : "+((ReflectBean)objectClass).test2);
        //private属性の取得と設定
        Field field = objectClass.getClass().getDeclaredField("intValue1");
        field.setAccessible(true);
        System.out.println("name : "+field.getName());
        System.out.println("value : "+field.getInt(objectClass));
        field.set(objectClass,999);
        System.out.println("updated value : "+field.getInt(objectClass));
        break;
       case 1 :
        //リフレクトで、変数変化可能のメソッドを利用する。
        Object[] objectParam = {"陈飞"};
        Class[] pramTypeArray = {int.class,int[].class};
        Object[] paramValueArray = {2,new int[]{3,5,6}};
        objectClass = cons.newInstance(objectParam);
        Method fucMethod = objectClass.getClass().getMethod("fuc",pramTypeArray);
        fucMethod.invoke(objectClass,paramValueArray);
        break;
    }
   }
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java反射可以让我们在运行时获取和操作类的信息,包括类的属性、方法、构造函数等。下面是一个使用Java反射的简单案例: 假设我们有一个类Person: ```java public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public void sayHello() { System.out.println("Hello, my name is " + name + ", I am " + age + " years old."); } } ``` 现在,我们可以使用反射来获取和调用Person类的构造函数和方法: ```java import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class ReflectionExample { public static void main(String[] args) throws Exception { // 获取Person类的Class对象 Class<Person> personClass = Person.class; // 获取Person类的构造函数 Constructor<Person> constructor = personClass.getConstructor(String.class, int.class); // 使用构造函数创建Person对象 Person person = constructor.newInstance("Tom", 20); // 获取Person类的sayHello方法 Method sayHelloMethod = personClass.getMethod("sayHello"); // 调用sayHello方法 sayHelloMethod.invoke(person); } } ``` 以上代码中,我们首先通过`Person.class`获取了Person类的Class对象,然后使用`getConstructor`方法获取了Person类的构造函数,并使用构造函数创建了一个Person对象。接着,我们使用`getMethod`方法获取了Person类的`sayHello`方法,并使用`invoke`方法调用了该方法。最终,我们输出了`Hello, my name is Tom, I am 20 years old.`。 这只是一个简单的反射案例,实际上Java反射还可以做很多其他的事情,比如动态代理、注解处理等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值