1. 反射调用默认访问权限的内部类

package com.blueStarWei.invoke;

import java.lang.reflect.Method;

import com.blueStarWei.invoke.OuterClass.InnerClass;

class OuterClass {
public void func(){
System.out.println("Outer Class.");
} class InnerClass {
private String mName;
public InnerClass(String mName) {
this.mName = mName;
}
void getName(){
System.out.println("Name is : "+mName);
} }
} public class OuterInnerClass { public static void main(String[] args) {
try {
/*通过反射实例化内部类
* 强大之处在于:当内部类私有化(private class InnerClass)时,也可以调用
* */
Class outerClass = Class.forName("com.blueStarWei.invoke.OuterClass");
Class innerClass = Class.forName("com.blueStarWei.invoke.OuterClass$InnerClass");
Method method = innerClass.getDeclaredMethod("getName");
//TODO study it
//内部类newInstance的第一个参数必须是外部类实例的引用
method.invoke(innerClass.getDeclaredConstructors()[0].newInstance(outerClass.newInstance(),"Wei"));//Name is : Wei /*常规方法实例化内部类
* 当内部类私有化时,无法通过该方式实例化内部类
* */
OuterClass outerClass1 = new OuterClass();
InnerClass innerClass1 = outerClass1.new InnerClass("David");
innerClass1.getName();//Name is : David
} catch (Exception e) {
e.printStackTrace();
}
}
}

2. 反射调用静态内部类

package com.blueStarWei.invoke;

import java.lang.reflect.Method;

class OuterClass {
public void func(){
System.out.println("Outer Class.");
} static class InnerClass {
private String mName;
public InnerClass(String mName) {
this.mName = mName;
}
void getName(){
System.out.println("Name is : "+mName);
}
}
} public class StaticInnerClass { public static void main(String[] args) {
try {
/*通过反射实例化内部类 */
Class outerClass = Class.forName("com.blueStarWei.invoke.OuterClass");
Class innerClass = Class.forName("com.blueStarWei.invoke.OuterClass$InnerClass");
Method method = innerClass.getDeclaredMethod("getName");
//静态内部类没有持有外部类的引用,不需要传递外部类实例对象的引用
method.invoke(innerClass.getDeclaredConstructors()[0].newInstance("Wei"));//Name is : Wei } catch (Exception e) {
e.printStackTrace();
}
}
}

3. 反射调用匿名内部类

package com.blueStarWei.invoke;

class OuterClass {
public Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("This is InnerClass.");
}
};
} public class AnonymousInnerClass {
public static void main(String[] args) {
try {
Class outerClass = Class.forName("com.blueStarWei.invoke.OuterClass");
//将匿名内部类当作外部类的成员变量
Runnable runnable = (Runnable) outerClass.getDeclaredField("runnable").get(outerClass.newInstance());
runnable.run();
} catch (Exception e) {
e.printStackTrace();
}
}
}

   更多内容,请访问:http://www.cnblogs.com/BlueStarWei/

Java反射之调用内部类的更多相关文章

  1. 通过JAVA反射,调用未知类的类方法

    下面是一个比较简单的通过JAVA的反射机制调用已知方法的例子 package com.togeek.mvntest; import java.lang.reflect.InvocationTarget ...

  2. Java 反射 方法调用

    在使用Java 反射时,对方法的调用,可能碰到最多的问题是,方法的变量如何使用.其实,调用方法的变量全部在参数数组里,不管有多少个参数,你都要把它放在参数数组里,如果是单个非数组参数,则可不使用参数数 ...

  3. Java反射机制调用对象的方法 —— 将一个对象的属性值赋值给另一个对象的属性

    模拟一个场景: 众所周知,EasyExcel导出Excel文档是依赖于注解完成的,在实体类需要导出的属性上面加上注解,导出的时候会自动识别该属性. 假如我们现在需要导出用户的信息,又不想污染原本的实体 ...

  4. 利用java反射动态调用方法,生成grid数据

    项目中需要java后台查询并组装前台grid的数据,数据行数不定,数据行定义不定,开始用了最原始的方法,写了几百行,就是前台需要什么字段后台拼接什么字段,java代码冗余量非常大,并且不够灵活,一旦前 ...

  5. Java反射机制调用private类型的构造方法

    单例类: package singleton; public class SingletonTest { // 私有构造方法 private SingletonTest(){ System.out.p ...

  6. Java反射机制调用私有方法

    1.获取目标类: 每个类都有一个class属性,通过实体类的class属性获取: Class clazz = Person.class 通过对象获取.  Person p1 = new Person( ...

  7. Java 反射 调用私有构造方法

    单例类: package singleton; public class SingletonTest { // 私有构造方法 private SingletonTest(){ System.out.p ...

  8. java 通过反射机制调用某个类的方法

    package net.xsoftlab.baike; import java.lang.reflect.Method; public class TestReflect {     public s ...

  9. java反射 cglib asm相关资料

    有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...

随机推荐

  1. 今日成为CSDN认证专家

    认证时写的申请材料: 程序猿一枚毕业于南开工作于上海.喜欢读书,喜欢跑步,激情似火,心静如水. 喜欢编程,喜欢寻根问底各种技术,喜欢在各种新技术中汲取营养. 喜欢分享,因此以一些高质量的博文来回报各位 ...

  2. 【一天一道LeetCode】#100. Same Tree(100题大关)

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...

  3. React Native控件之Listview

    ListView组件用于显示一个垂直的滚动列表,其中的元素之间结构近似而仅数据不同. ListView更适于长列表数据,且元素个数可以增删.和ScrollView不同的是,ListView并不立即渲染 ...

  4. 【一天一道LeetCode】#33. Search in Rotated Sorted Array

    一天一道LeetCode 本系列文章已全部上传至我的github,地址: https://github.com/Zeecoders/LeetCode 欢迎转载,转载请注明出处 (一)题目 Suppos ...

  5. Gradle脚本打包so库

    要让引用的第三方的so库被打包进去,只需要把相关的armeabi文件夹放在libs下面,然后在builld.gradle脚本中加上这一句: sourceSets{ main { jniLibs.src ...

  6. javascript语法之with语句

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 开源视频会议系统:OpenMeetings 安装方法

    OpenMeetings是一个多语言可定制的视频会议和协作系统.说到OpenMeetings就应该提一下red5因为OpenMeetings 的视频服务是加载red5上面的.Red5是一款基于JAVA ...

  8. CTBS问题百科

    1.浏览CTBS网站时,Service Unavailable或应用程序池自动停止的现象 解决方法: 点击"开始"-"控制面板"-"管理工具" ...

  9. Mahout kmeans聚类

    Mahout  K-means聚类 一.Kmeans 聚类原理 K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚 ...

  10. java反射案例详解

    白首为功名.旧山松竹老,阻归程.欲将心事付瑶琴.知音少,弦断有谁听? [案例1]通过一个对象获得完整的包名和类名 package Reflect; /** * 通过一个对象获得完整的包名和类名 * * ...