Home > Java > javaTutorial > body text

Reflection basics of java

黄舟
Release: 2017-02-24 09:51:16
Original
1047 people have browsed it


1. What is reflection


The reflection mechanism is in the running state, for any Class, you can know all the methods and attributes of this class; for any object, you can call any of its methods and attributes. This information and dynamically call the object's method is called Java's reflection mechanism.

2. The role of reflection

  • 1. Decompilation: .class–>java

  • ##2 , Access the properties, methods, constructors, etc. of objects through the reflection mechanism

3. Specific implementation of reflection

3. 1 Reflection-related classes

  • java.lang.Class;

  • java.lang.reflect.Constructor;

  • java.lang.reflect .Field;

  • java.lang.reflect.Method;

  • ##java.lang.reflect.Modifier;
  • 3.2 Three ways to obtain large Class objects

Since any class is a subclass of Object and there is getClass in Object, you can obtain

Class objects - public final native Class<?> 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();
    }
}
Copy after login

3.3 Create an object

 After obtaining the

Class

object, use it to create an object, call the no-argument constructor through newInstance() to create the object, newInstance() returns An Object:

Class<?> c1 = Class.forName("com.chb.reflectTest.Test");Object o1 = c1.newInstance();
Copy after login
Copy after login
3.4. Obtaining data

It is divided into all attributes and specified attributes

3.4.1. Obtaining all attributes

    Get the modifications
    • First get the modification object through getModifiers() of the attribute,
    • Then through java.long. reflect.Modifier's toString() prints classes and attribute modifications (public, static, final, etc.).
    Get attributes
    • Get all attributes: Return a Fielded array* through getDeclaedFields() of the Class object *.
    Get the type of attribute:
    • Through getType() of the attribute object (Field object)
    • 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("}");
      Copy after login
      Copy after login
    3.4.2 Get the specified attribute

Create a test object:

Note: I defined two attributes in the Use class, one public, A private, for the next test reflection can break the encapsulation

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...

}
Copy after login
Copy after login
Comparison between traditional attribute acquisition and acquisition through reflection:

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));

    }
}
Copy after login
Copy after login

Set the value of the attribute through reflection, distinguishing attributes Modification range, private cannot be set directly

An access error will occur, which is the safe access mechanism of java, error message:

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"
Copy after login
Copy after login

We use a method to break the encapsulation of java:

nameFiled.setAccessible(true);
Copy after login
Copy after login

1. What is reflection?

The reflection mechanism is in the

running state

. For any class, you can know all the methods and attributes of this class; for any object , you can call any of its methods and attributes. This information and dynamically calling the object method are called Java's reflection mechanism. 2. The role of reflection

    1. Decompilation: .class–>java
  • ##2 , Access the properties, methods, constructors, etc. of objects through the reflection mechanism
  • 3. Specific implementation of reflection
3. 1 Reflection-related classes

java.lang.Class;
  • java.lang.reflect.Constructor;
  • java.lang.reflect .Field;
  • java.lang.reflect.Method;
  • ##java.lang.reflect.Modifier;

  • 3.2 Three ways to obtain large Class objects

  • Since any class is a subclass of Object and there is getClass in Object, you can obtain

Class

objects - public final native Class<?> 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();
    }
}
Copy after login
3.3 Create an object
 After obtaining the

Class

object, use it to create an object, call the no-argument constructor through newInstance() to create the object, and newInstance() returns An Object:

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

3.4. Obtaining data It is divided into all attributes and specified attributes

3.4.1. Obtaining all attributes

Get the modifications

  • First get the modification object through getModifiers() of the attribute,
    • Then through java.long. reflect.Modifier's toString() prints classes and attribute modifications (public, static, final, etc.).

    • Get attributes
  • Get all attributes: Return a Fielded array* through getDeclaedFields() of the Class object *.
    • Get the type of attribute:
      • 通过属性对象(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("}");
    Copy after login
    Copy after login

    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...
    
    }
    Copy after login
    Copy after login

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

    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));
    
        }
    }
    Copy after login
    Copy after login

    通过反射来设置属性的值, 区别属性的修饰范围, 私有的不可以直接设置
    会出现访问错误, 也就是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"
    Copy after login
    Copy after login

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

    nameFiled.setAccessible(true);
    Copy after login
    Copy after login

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


Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template