JAvaアクセス修飾子および反射使用

7000 ワード

一、アクセス修飾子
1、追加
	public:    
	private:    
	protected:    
	defult:    

2、追加しない
  protected:      

二、反射
1、反射とは何か
Java           ,       ,                ;        ,                ;                         Java       

2、使用手順
  • 操作したいクラスのjava.lang.Classオブジェクトを取得します.実行中のJavaプログラムでは、java.lang.Classクラスでクラスやインタフェースなどを記述します.
  • getDeclaredMethodsのようなメソッドを呼び出し、クラスで定義されたすべてのメソッドのリストを取得する.
  • は、反射されたAPIを使用してこれらの情報を操作する.

  • 3、Classオブジェクトを取得する3つの方法
  • オブジェクトのgetClassメソッドを取得します.この方法では、特定のクラスとそのクラスのオブジェクト、およびgetClassメソッドを呼び出す必要があります.
  • 基本データ型を含む任意のデータ型は、そのタイプに対応するClassオブジェクトを直接取得できる静的属性classを備えている.この方法では、特定のクラスを使用し、呼び出しクラスの静的属性classが完了し、呼び出し方法を必要とせず、よりパフォーマンスが向上します.
  • はClass.forName()メソッドで取得されます.この方法ではクラス名を使用するだけでクラスのClassオブジェクトを取得でき、拡張に役立ちます.

  • 4、api使用
    1.java反射を使用してクラスのコンストラクション関数(共有、プライベート)を取得します(パラメータあり、パラメータなし)
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
    /**
     *     java               
     * @author Sunshine
     *
     */
    public class ReflectPer {
        private static Class class1;
        //  java            ,       Junit @beforeclass     ,              
        // :@beforeclass          
        @BeforeClass
        public static void beforeClass() throws Exception{
            System.out.println("====           ====");
            class1 = Class.forName("myPractise.Per");//   
        }
        //            ,     
        @Test
        public void test1() throws Exception{
            Constructor constructor = class1.getConstructor(null);//         ,  null         
            Per per = (Per) constructor.newInstance(null);//    ,    Object     
            System.out.println(per.name);//        -----  
        }
        //           ,     
        @Test
        public void test2()throws Exception{
            Constructor constructor = class1.getConstructor(String.class,int.class);//           ,            
            Per per = (Per)constructor.newInstance("baby",24);//    
        }
        //            ,     
        @Test
        public void test3()throws Exception{
            Constructor constructor = class1.getDeclaredConstructor(String.class);//           ,            
            constructor.setAccessible(true);//    ,        true       
            Per per = (Per)constructor.newInstance("baby");
            System.out.println(per.weight);//        -----  
            // :                       ,  。。    java    
        }
        @AfterClass
        public static void afterClass(){
            System.out.println("===          null===");
        }
    }
    

    2.java反射を使用してクラスを取得する方法(共有、プライベート)(パラメータあり、パラメータなし)
     import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
    /**
     *     java       
     * @author Sunshine
     *
     */
    public class ReflectPer {
        private static Class class1;
        private static Per per;
        //  java            ,       Junit @beforeclass     ,            
        // :@beforeclass          
        @BeforeClass
        public static void beforeClass() throws Exception{
            System.out.println("====           ====");
            class1 = Class.forName("myPractise.Per");//   
            per = (Per) class1.getConstructor(null).newInstance(null);//        
        }
        
        //          
        @Test
        public void test4()throws Exception{
            Method method = class1.getMethod("methodT1", null);//       ,               ,             ,    null
            method.invoke(per, null);//  invoke     ,       ,        ,             ,    null
        }
        //          
        @Test
        public void test5()throws Exception{
            Method method = class1.getMethod("methodT1", String.class,int.class);//       ,               
            method.invoke(per, "sunshine",25);//  invoke     ,       ,        
        }
        @Test
        public void test6()throws Exception{
            Method method = class1.getDeclaredMethod("methodT1", String.class);//       ,               
            method.setAccessible(true);//    ,   false,               
            method.invoke(per, "sunshine");//  invoke     ,       ,        
            System.out.println(method.getReturnType());//               
        }
        @Test
        public void test7()throws Exception{
            Method method = class1.getMethod("methodT2", int[].class,String[].class);
            method.invoke(per, new int[]{1,2},new String[]{"AA","BB"});
        }
        //      main                         
        //jdk5      --    
        //               ,      ,java.lang.IllegalArgumentException: wrong number of arguments        
        //              ,              new String[]{"AA","BB"}  (Object)new String[]{"AA","BB"}
        @Test
        public void test8()throws Exception{
            Method method = class1.getMethod("main",String[].class);
            method.invoke(per,(Object)new String[]{"AA","BB"});
        }
        @AfterClass
        public static void afterClass(){
            System.out.println("===          null===");
        }
    }
    

    3.java反射を使用してクラスのプロパティ(共有、プライベート)を取得する
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.Iterator;
    
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
    
    /**
     *     java        
     * 
     * @author Sunshine
     *
     */
    public class ReflectPer {
        private static Class class1;
        private static Per per;
    
        //   java            ,       Junit @beforeclass     ,              
        //  :@beforeclass          
        @BeforeClass
        public static void beforeClass() throws Exception {
            System.out.println("====           ====");
            class1 = Class.forName("myPractise.Per");//    
            per = (Per) class1.getConstructor(null).newInstance(null);//         
        }
        //     
        @Test
        public void test9() throws Exception {
            //       ,      
            Field field = class1.getField("name");
            //      ,        
            System.out.println(field.get(per));
            //        
            System.out.println(field.getType());
            //       
            Field[] field1 = class1.getFields();
            //   for  Jdk1.5     ,          Iterator   
            for (Field str : field1) {
                System.out.println(str);
            }
            //      
            field.set(per, "baby");
            System.out.println(field.get(per));
        }
        //    
        @Test
        public void test10() throws Exception {
            Field field = class1.getDeclaredField("age");
            field.setAccessible(true);//    
            System.out.println(field.get(per));
        }
    
        @AfterClass
        public static void afterClass() {
            System.out.println("===          null===");
        }
    }