Java日记——获取内部类的几种方式

来源:互联网 发布:淘宝违规12分 编辑:程序博客网 时间:2024/05/23 02:02

内部类用于增强类与类的耦合关系,也是经常会用到的,下面是几种在静态方法中获取内部类的方式

1.内部类设为静态类

public class TestInnerClass {    public static class InnerClass {        public void hi(){            System.out.println("hi");        }    }    public static void main(String[]args){        InnerClass innerClass=new InnerClass();        innerClass.hi();    }}

2.实例化对象后调用public方法

public class TestInnerClass {    class InnerClass {        public void hi(){            System.out.println("hi");        }    }    public InnerClass getInnerClass(){        InnerClass innerClass =new InnerClass();        return innerClass;    }    public static void main(String[]args){        TestInnerClass testInnerClass=new TestInnerClass();        InnerClass innerClass=testInnerClass.getInnerClass();        innerClass.hi();    }}

3.直接实例化

public class TestInnerClass {    class InnerClass {        public void hi(){            System.out.println("hi");        }    }    public static void main(String[]args){        InnerClass innerClass=new TestInnerClass().new InnerClass();        innerClass.hi();    }}

4.利用反射

public class TestInnerClass {    class InnerClass {        public void hi(){            System.out.println("hi");        }    }    public static void main(String[]args){    try {            //1.需要外部类的实例            TestInnerClass testInnerClass=new TestInnerClass();            //2.需要外部类的Class            Class clazz=TestInnerClass.class;            //2.需要内部类的Class            Class c2 = InnerClass.class;            //3.获得内部类的构造器            Constructor con2 = c2.getDeclaredConstructor(clazz);            //4.把构造器设为可用            con2.setAccessible(true);            //5.利用构造器生成内部类实例            InnerClass innerClass1 = (InnerClass) con2.newInstance(testInnerClass);            innerClass1.hi();        } catch (IllegalAccessException e) {            e.printStackTrace();        } catch (InstantiationException e) {            e.printStackTrace();        } catch (NoSuchMethodException e) {            e.printStackTrace();        } catch (InvocationTargetException e) {            e.printStackTrace();        }    }}