Rumah  >  Artikel  >  Java  >  java之反射基础

java之反射基础

黄舟
黄舟asal
2017-02-24 09:51:161048semak imbas


1、反射是什么


  反射机制是在运行状态中,对任意的一个类,都可以知道这个类的所有方法和属性; 对于任何一个对象,都可以调用他的任意方法和属性,这种9c43e4cb0570fbb9eaafc9cf4591e623的信息以及动态调用对象的方法称为java的反射机制。

2、反射的作用

  • 1、反编译: .class–>java

  • 2、通过反射机制访问对象的属性,方法,构造方法等

3、反射的具体实现

3、1反射相关的类

  • java.lang.Class;

  • java.lang.reflect.Constructor;

  • java.lang.reflect.Field;

  • java.lang.reflect.Method;

  • java.lang.reflect.Modifier;

3.2 获取大Class对象的三种方式

由于任何类都是Object的子类而Object中有getClass可以获取Class对象
- public final native Class6b3d0130bba23ae47fe2b8e8cddf0195 getClass();
-

package com.chb.reflectTest;public class Test {
    public static void main(String[] args) throws Exception {        //第一种方式:
        Class<?> c1 = Class.forName("com.chb.reflectTest.Test");    //第二种方式:java中每个类都有class属性
        Class<?> c2 = Test.class;        //第三种方式:每个对象都与getClass()方法
        Class<?> c3 = new Test().getClass();
    }
}

3.3创建对象

  获取Class对象以后,使用它创建对象,通过newInstance()调用无参构造函数进行创建对象,newInstance()返回一个Object对象:

Class<?> c1 = Class.forName("com.chb.reflectTest.Test");Object o1 = c1.newInstance();

3.4、获取数据

  分为所有属性和制定的属性

3.4.1、获取所有属性

  • 获取修饰

    • 首先通过属性的getModifiers()获取修饰对象,

    • 再通过java.long.reflect.Modifier的toString()打印类,属性的修饰(public , static ,final等)。

  • 获取属性

    • 获取所有属性:通过Class对象的getDeclaedFields(),返回一个Filed的数组**。

  • 获取属性的类型:

    • 通过属性对象(Field对象)的getType()

Class<?> cString = Class.forName("java.lang.String");
        //获取累的修饰和名称
        System.out.print(Modifier.toString(cString.getModifiers())+" class " + cString.getSimpleName()+"{\n");
        //获取所有属性
        Field[] fields = cString.getDeclaredFields();
        for (Field field : fields) {
            System.out.print("\t");
            System.out.print(
                    Modifier.toString(field.getModifiers())+" "//属性的修饰
                  + field.getType().getSimpleName()+" "
                  + field.getName()+"\n");           
        }
        System.out.println("}");

3.4.2 获取指定属性

创建测试对象:
注意: 我在Use类中定义了两个属性, 一个public ,一个private ,是为了下一个测试反射可以打破封装性

package com.chb.reflectTest;public class User {    
private String name;    
public  String nickName;    
public User() {}    
public User(String name, String nickName) {        
this.name = name;        
this.nickName = nickName;
    }
    setter getter...

}

传统属性的获取和通过反射获取对比:

package com.chb.reflectTest;import java.lang.reflect.Field;public class Test1 {
    public static void main(String[] args) throws Exception {
        //传统获取属性的值
        //1、通过getter,setter
        User user1 = new User();
        user1.setName("lisi");
        System.out.println(user1.getName());
        //2、直接调用属性
        User user2 = new User();
        user2.nickName = "癞皮狗";
        System.out.println(user2.nickName);
        //=========================================
        //通过反射来设置,获取属性。
        Class<User> c1 = (Class<User>) Class.forName("com.chb.reflectTest.User");
        User user = c1.newInstance();
        Field nickField = c1.getDeclaredField("nickName");
        nickField.set(user, "123");
        System.out.println(nickField.get(user));

        Field nameFiled = c1.getDeclaredField("name");
        //Exception in thread "main" java.lang.IllegalAccessException: 
        Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.User with modifiers "private"
        nameFiled.setAccessible(true);
        nameFiled.set(user, "oup");
        System.out.println(nameFiled.get(user));

    }
}

通过反射来设置属性的值, 区别属性的修饰范围, 私有的不可以直接设置
会出现访问错误, 也就是java的安全访问机制,报错:

Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.
User with modifiers "private"

我们通过一个方法·来打破java的封装性:

nameFiled.setAccessible(true);

1、反射是什么

  反射机制是在运行状态中,对任意的一个类,都可以知道这个类的所有方法和属性; 对于任何一个对象,都可以调用他的任意方法和属性,这种9c43e4cb0570fbb9eaafc9cf4591e623的信息以及动态调用对象的方法称为java的反射机制。

2、反射的作用

  • 1、反编译: .class–>java

  • 2、通过反射机制访问对象的属性,方法,构造方法等

3、反射的具体实现

3、1反射相关的类

  • java.lang.Class;

  • java.lang.reflect.Constructor;

  • java.lang.reflect.Field;

  • java.lang.reflect.Method;

  • java.lang.reflect.Modifier;

3.2 获取大Class对象的三种方式

由于任何类都是Object的子类而Object中有getClass可以获取Class对象
- public final native Class6b3d0130bba23ae47fe2b8e8cddf0195 getClass();
-

package com.chb.reflectTest;public class Test {
    public static void main(String[] args) throws Exception {        //第一种方式:
        Class<?> c1 = Class.forName("com.chb.reflectTest.Test");        //第二种方式:java中每个类都有class属性
        Class<?> c2 = Test.class;        //第三种方式:每个对象都与getClass()方法
        Class<?> c3 = new Test().getClass();
    }
}

3.3创建对象

  获取Class对象以后,使用它创建对象,通过newInstance()调用无参构造函数进行创建对象,newInstance()返回一个Object对象:

Class<?> c1 = Class.forName("com.chb.reflectTest.Test");Object o1 = c1.newInstance();

3.4、获取数据

  分为所有属性和制定的属性

3.4.1、获取所有属性

  • 获取修饰

    • 首先通过属性的getModifiers()获取修饰对象,

    • 再通过java.long.reflect.Modifier的toString()打印类,属性的修饰(public , static ,final等)。

  • 获取属性

    • 获取所有属性:通过Class对象的getDeclaedFields(),返回一个Filed的数组**。

  • 获取属性的类型:

    • 通过属性对象(Field对象)的getType()

Class<?> cString = Class.forName("java.lang.String");
        //获取累的修饰和名称
        System.out.print(Modifier.toString(cString.getModifiers())+" class " + cString.getSimpleName()+"{\n");
        //获取所有属性
        Field[] fields = cString.getDeclaredFields();
        for (Field field : fields) {
            System.out.print("\t");
            System.out.print(
                    Modifier.toString(field.getModifiers())+" "//属性的修饰
                  + field.getType().getSimpleName()+" "
                  + field.getName()+"\n");           
        }
        System.out.println("}");

3.4.2 获取指定属性

创建测试对象:
注意: 我在Use类中定义了两个属性, 一个public ,一个private ,是为了下一个测试反射可以打破封装性

package com.chb.reflectTest;public class User {    
private String name;    
public  String nickName;    
public User() {}    
public User(String name, String nickName) {        
this.name = name;        
this.nickName = nickName;
    }
    setter getter...

}

传统属性的获取和通过反射获取对比:

package com.chb.reflectTest;import java.lang.reflect.Field;public class Test1 {
    public static void main(String[] args) throws Exception {
        //传统获取属性的值
        //1、通过getter,setter
        User user1 = new User();
        user1.setName("lisi");
        System.out.println(user1.getName());
        //2、直接调用属性
        User user2 = new User();
        user2.nickName = "癞皮狗";
        System.out.println(user2.nickName);
        //=========================================
        //通过反射来设置,获取属性。
        Class<User> c1 = (Class<User>) Class.forName("com.chb.reflectTest.User");
        User user = c1.newInstance();
        Field nickField = c1.getDeclaredField("nickName");
        nickField.set(user, "123");
        System.out.println(nickField.get(user));

        Field nameFiled = c1.getDeclaredField("name");
        //Exception in thread "main" java.lang.IllegalAccessException: 
        Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.User with modifiers "private"
        nameFiled.setAccessible(true);
        nameFiled.set(user, "oup");
        System.out.println(nameFiled.get(user));

    }
}

通过反射来设置属性的值, 区别属性的修饰范围, 私有的不可以直接设置
会出现访问错误, 也就是java的安全访问机制,报错:

Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.
User with modifiers "private"

我们通过一个方法·来打破java的封装性:

nameFiled.setAccessible(true);

 以上就是java之反射基础的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:java之反射进阶Artikel seterusnya:java之泛型深入