variáveis membro reflexão de reflexão do Java

Anterior descreve a estrutura do método de reflexão reflexão Java . Desta vez falamos sobre como as variáveis de membro reflexão em sala de aula e usados como um caso simples.

[A] Classe campo,

Arquivado classe representa o campo que contém todos os campos têm propriedades, tais como os modificadores, tipo variável, valor, etc., classe Arquivado tem um método para obter essas propriedades.
E as classes Construtor herdar como um java.lang.reflect.AccessibleObject classe, existem formas de determinar se o acesso e configurar a propriedade privada.
Para as seguintes mostra como modificar, para obter uma variável de classe:
classe Point:

public class Point {
    public int x;
    private int y;
    public static int z = 10;
    
    public Point(int x, int y) {
        super();
        this.x = x;
        this.y = y;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
}

Método de ensaio:

public static void main(String[] args) throws Exception {
        Point p = new Point(3,4);
        Class cls = p.getClass();
        //1、获得Point类中所有的成员变量
        Field[] fields = cls.getFields();
        //打印
        for(Field field : fields){
            //get(p);获得对象p的所有成员变量
            System.out.println(field.get(p));
        }
        
        //2、获得Point类中的指定x,y,z变量
        Field fieldX = cls.getField("x");
        Field fieldY = cls.getField("y");
        Field fieldZ = cls.getField("z");
        //分别对应对象p
        System.out.println("x:"+fieldX.get(p)+" y:"+fieldY.get(p)+" z:"+fieldZ.get(null));
        
    }

resultados:

3
10
Exception in thread "main" java.lang.NoSuchFieldException: y
    at java.lang.Class.getField(Class.java:1584)
    at club.leyvan.muzile.ConstructDemo.main(ConstructDemo.java:20)

GetFields classe Class (): obter todos os campos, tais como o objeto da classe Field.
getFields classe classe (String name): para obter o campo de classe e parâmetros de mesmo nome.
classe Arquivado get (p): Este campo é que se ligam um corpo alvo. Exemplos do passe p, a ligação campo membro de campo-alvo correspondente ao objecto específico e é um nome de objecto valor de p do campo no objecto que representa o método.
Variáveis estáticas pertencentes à classe por isso não precisa vincular um objeto específico, você pode obter um valor nulo passagem campo estático.
A primeira parte do código, além de variáveis privadas são impressos, e a segunda parte do relatório estava errado, não a variável privada y, podemos ver que ser uma variável privada não pode ser lido. Nós agora colocar as seguintes alterações no código, você pode obter o valor de uma variável privada.
Código é modificado como segue:

public static void main(String[] args) throws Exception {
        Point p = new Point(3,4);
        Class cls = p.getClass();
        //1、获得Point类中所有的成员变量
        Field[] fields = cls.getFields();
        //打印
        for(Field field : fields){
            //get(p);获得对象p的所有成员变量
            System.out.println(field.get(p));
        }
        
        //2、获得Point类中的指定x,y,z变量
        Field fieldX = cls.getField("x");
        //修改部分↓↓
        Field fieldY = cls.getDeclaredField("y");
        fieldY.setAccessible(true);
        //修改部分↑↑
        Field fieldZ = cls.getField("z");
        //分别对应对象p
        System.out.println("x:"+fieldX.get(p)+" y:"+fieldY.get(p)+" z:"+fieldZ.get(null));
        
    }

resultados:

3
10
x:3 y:4 z:10

Classe classe getDeclaredField (String name): obter variáveis privadas
campo herda de classe classe java.lang.reflect.AccessibleObject tem setAccessible (boolean b): Defina se o acesso a membros privados.
O método acima chamada violência reflexivo, a violência pode obter membros privados.

[Di] Caso: reflexão maneira usando uma variável de classe do tipo String tudo "b" modificar "a"

Categorias de feijão:

package club.leyvan.muzile;

public class Bean {
    public int i1 = 10;
    public String str1 = "basketball";
    private String str2 = "breakfast";
    private static String str3 = "bbc";
    @Override
    public String toString() {
        return "Bean [i1=" + i1 + ", str1=" + str1 + ", str2=" + str2 + "]";
    }
    
    public static String getStr3(){
        return "str3: "+str3;
    }
}

Método de ensaio:

public static void main(String[] args) throws Exception {
        //获得class
        Class cls = Class.forName("club.leyvan.muzile.Bean");
        //创建一个对象 默认调用无参构造方法
        Bean obj = (Bean)cls.newInstance();
        //获得所有字段
        Field[] fields = cls.getDeclaredFields();
        //扫描所有字段
        for(Field field : fields){
            //class对象只有一份,所以使用==更好
            if(field.getType() == String.class){
                //判断是否是
                if(!field.isAccessible()){
                    field.setAccessible(true);
                }
                //判断是否是静态字段
                //getModifiers()获得所有的修饰符
                //boolean isStatic = Modifier.isStatic(field.getModifiers());
                String oldValue = (String)field.get(obj);
                String newValue = oldValue.replace('b', 'a');
                field.set(obj, newValue);
            }
        }
        System.out.println(obj+Bean.getStr3());
    }

resultados:

Bean [i1=10, str1=aasketaall, str2=areakfast]str3: aac

Em que field.getModifiers (): obter todos os modificadores
Modifier.isStatic (): determinar se modificador é obtido por estática
field.set (obj, valor): modificar o valor do objecto dependente

Em seguida, dizer reflexão dos membros do método de reflexão Java

Acho que você gosta

Origin www.cnblogs.com/leyvan/p/12461699.html
Recomendado
Clasificación