zoukankan      html  css  js  c++  java
  • 廖雪峰Java4反射与泛型-1反射-2访问字段Field和3调用方法Method

    2.字段Field

    2.1.通过Class实例获取字段field信息:

    • getField(name): 获取某个public的field,包括父类
    • getDeclaredField(name): 获取当前类的某个field,不包括父类
    • getFields(): 获取所有public的field,包括父类
    • getDeclaredFields(): 获取当前类的所有field,不包括父类

    Hello.java

    package com.reflection;
    
    import java.util.ArrayList;
    
    public interface Hello {
        ArrayList[] listname = new ArrayList[5];
        public void hello();
    }
    

    Student.java

    package com.reflection;
    
    public class Student implements Hello{
        private String name;
        public int age ;
        public Student(){
            this("unNamed");
        }
        public Student(String name){
            this.name=name;
        }
        public void hello(){
            System.out.println(name+" is Student");
        }
    }
    

    Main.java

    package com.reflection;
    
    import java.lang.reflect.Field;
    
    public class Main {
        public static void main(String[] args) throws NoSuchFieldException{
            Class cls = Student.class;
            System.out.println("获取age:"+cls.getField("age"));
            System.out.println();
            System.out.println("获取父类的listname:"+cls.getField("listname"));
            System.out.println();
            System.out.println("获取age:"+cls.getDeclaredField("age"));
            System.out.println();
            try{
                System.out.println("获取父类的listname:"+cls.getDeclaredField("listname"));
            }catch (Exception e){
                System.out.println("获取父类的listname:"+e);
            }
            System.out.println();
            System.out.println("获取全部的field,包含父类:");
            for(Field field:cls.getFields()){
                System.out.println(field);
            }
            System.out.println();
            System.out.println("获取全部的field,不包括父类:");
            for(Field field:cls.getDeclaredFields()){
                System.out.println(field);
            }
        }
    }
    

    2.2.Field对象包含一个field的所有信息:

    • getName()
    • getType()
    • getModifiers()
    JAVA 反射机制中,Field的getModifiers()方法返回int类型值表示该字段的修饰符。
    其中,该修饰符是java.lang.reflect.Modifier的静态属性。
    对应表如下:
    PUBLIC: 1    PRIVATE: 2    PROTECTED: 4    STATIC: 8
    FINAL: 16    SYNCHRONIZED: 32    VOLATILE: 64
    TRANSIENT: 128    NATIVE: 256    INTERFACE: 512
    ABSTRACT: 1024    STRICT: 2048
    

    Main.java

    package com.reflection;
    
    import java.lang.reflect.Field;
    
    public class Main {
        public static void main(String[] args) throws NoSuchFieldException{
            Class cls = Student.class;
            Field field1 = cls.getField("age");
            System.out.println(field1.getName());
            System.out.println(field1.getType());
            System.out.println(field1.getModifiers());
        }
    }
    

    2.3.获取和设置field的值:

    • get(Object obj):
    • set(Object,Object)
    //疯狂Java840页
    import java.lang.reflect.Field;
    
    class Person {
        private String name;
        private int age;
        public String toString(){
            return "Person[name:" + name + ", age:" +age +"]";
        }
    }
    public class FieldTest{
        public static void main(String[] args) throws Exception{
            Class cls = Person.class;
            Person p = (Person) cls.newInstance();
            
            Field nameField = cls.getDeclaredField("name");
            nameField.setAccessible(true);
            nameField.set(p,"小明");
            
            Field ageField = cls.getDeclaredField("age");
            ageField.setAccessible(true);
            ageField.set(p,12);
           
            System.out.println(p.toString());
            System.out.println(ageField.get(p));
            System.out.println(nameField.get(p));
        }
    }
    

    2.4.通过反射访问Field需要通过SecurityManager设置的规则。

    通过设置setAccessible(true)来访问非public字段。

    3.调用方法Method

    3.1通过class实例获取方法Method信息:

    • getMethod(name,Class...):获取某个public的method(包括父类)
    • getDeclaredMethod(name,Class...):获取当前类的某个method(不包括父类)
    • getMethods():获取所有public的method(包括父类)
    • getDeclaredMethods():获取当前类的所有method(不包括父类)
      Animal.java
    package com.reflection;
    
    public class Animal {
        public void run(){
            System.out.println("动物再跑");
        }
        private void eat(String s,String i){
            System.out.println("动物每天能吃"+i+"Kg"+s);
        }
    }
    
    

    Dog.java

    package com.reflection;
    
    public class Dog extends Animal {
        public void bar(){
            System.out.println("狗在叫");
        }
        private void func(){
            System.out.println("狗能看家");
        }
    }
    
    

    Go.java

    package com.reflection;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class Go {
        public static void main(String[] args) throws ClassNotFoundException,NoSuchMethodException,IllegalAccessException,InstantiationException,InvocationTargetException {
            Class cls = Class.forName("com.reflection.Dog");
            Dog dog = (Dog)cls.newInstance();
    
            System.out.println("getMethod获取某个public的method,包括父类");
            Method pubMethod1 = cls.getMethod("run");
            System.out.print(pubMethod1.getName()+":");
            pubMethod1.invoke(dog);
            Method pubMethod2 = cls.getMethod("bar");
            System.out.print(pubMethod2.getName()+":");
            pubMethod2.invoke(dog);
            System.out.println();
    
            System.out.println("getDeclaredMethod:获取当前类的某个method,不包括父类");
            Method subMethod1 = cls.getDeclaredMethod("func");
            System.out.println(subMethod1.getName());
            Method subMethod2 = cls.getDeclaredMethod("bar");
            System.out.println(subMethod2.getName());
            System.out.println();
    
            System.out.println("getMethods():获取所有public的method(包括父类)");
            for(Method m:cls.getMethods()){
                System.out.println(m.getName());
            }
            System.out.println();
    
            System.out.println("getDeclaredMethods():获取当前类的所有method(不包括父类)");
            for(Method m:cls.getDeclaredMethods()){
                System.out.println(m.getName());
            }
        }
    }
    
    
    ## 3.2Method对象包含一个method的所有信息 * getName() * getReturnType() * getParameterTypes() * getModifiers() ```#java public class Go { public static void main(String[] args) throws ClassNotFoundException,NoSuchMethodException,IllegalAccessException,InstantiationException,InvocationTargetException { Class cls = Class.forName("com.reflection.Dog"); Dog dog = (Dog)cls.newInstance(); Method pubMethod1 = cls.getMethod("bar"); System.out.println(pubMethod1.getName()); System.out.println(pubMethod1.getReturnType()); System.out.println(pubMethod1.getParameterTypes()); System.out.println(pubMethod1.getModifiers());
    }
    

    }

    <img src="https://img2018.cnblogs.com/blog/1418970/201902/1418970-20190219195137187-650653198.png" width="500" />
    
    
    ##    3.3调用Method:
    *    Object invoke(Object obj,Object...args)
    通过设置setAccessible(true)来访问非public方法
    反射调用Method也遵守多态的规则
    <font color=#9400D3>参见3.1中代码</font>
    参考博客:
    [https://blog.csdn.net/z69183787/article/details/23852517](https://blog.csdn.net/z69183787/article/details/23852517)
    [https://blog.csdn.net/GhostFromHeaven/article/details/6498350](https://blog.csdn.net/GhostFromHeaven/article/details/6498350)
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    关于模态/非模态对话框不响应菜单的UPDATE_COMMAND_UI消息(对对WM_INITMENUPOPUP消息的处理)
  • 原文地址:https://www.cnblogs.com/csj2018/p/10345868.html
Copyright © 2011-2022 走看看