Java反射之调用内部类
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反射之调用内部类的更多相关文章
- 通过JAVA反射,调用未知类的类方法
下面是一个比较简单的通过JAVA的反射机制调用已知方法的例子 package com.togeek.mvntest; import java.lang.reflect.InvocationTarget ...
- Java 反射 方法调用
在使用Java 反射时,对方法的调用,可能碰到最多的问题是,方法的变量如何使用.其实,调用方法的变量全部在参数数组里,不管有多少个参数,你都要把它放在参数数组里,如果是单个非数组参数,则可不使用参数数 ...
- Java反射机制调用对象的方法 —— 将一个对象的属性值赋值给另一个对象的属性
模拟一个场景: 众所周知,EasyExcel导出Excel文档是依赖于注解完成的,在实体类需要导出的属性上面加上注解,导出的时候会自动识别该属性. 假如我们现在需要导出用户的信息,又不想污染原本的实体 ...
- 利用java反射动态调用方法,生成grid数据
项目中需要java后台查询并组装前台grid的数据,数据行数不定,数据行定义不定,开始用了最原始的方法,写了几百行,就是前台需要什么字段后台拼接什么字段,java代码冗余量非常大,并且不够灵活,一旦前 ...
- Java反射机制调用private类型的构造方法
单例类: package singleton; public class SingletonTest { // 私有构造方法 private SingletonTest(){ System.out.p ...
- Java反射机制调用私有方法
1.获取目标类: 每个类都有一个class属性,通过实体类的class属性获取: Class clazz = Person.class 通过对象获取. Person p1 = new Person( ...
- Java 反射 调用私有构造方法
单例类: package singleton; public class SingletonTest { // 私有构造方法 private SingletonTest(){ System.out.p ...
- java 通过反射机制调用某个类的方法
package net.xsoftlab.baike; import java.lang.reflect.Method; public class TestReflect { public s ...
- java反射 cglib asm相关资料
有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...
随机推荐
- Android初级教程短信防火墙
如果你有女神,而且有情敌的话,你看到这篇文章会有一种窃喜的感觉. 需求:对情敌的号码进行拦截,让女神手机永远收不到它的号码. 首先定义一个广播接收者类: package com.example.sms ...
- 【Unity Shaders】《Unity Shaders and Effects Cookbook》总结篇
我的唠叨 不知不觉,从发表第一篇关于<Unity Shaders and Effects Cookbook>已经快十个月了.一开始的初衷就是学习笔记,毕竟将来回过头去看的时候,再看英文难免 ...
- [Linux]vbox 虚拟机添加新磁盘
情况是这样的,开始创建虚拟机的时候硬盘设置太小了,只有10g,我现在通过vbox的设置给这个linux(centos6.6)虚拟机添加了一块硬盘. 下面的操作就是怎么把硬盘挂载到系统中. 通过 fdi ...
- 【一天一道LeetCode】#111. Minimum Depth of Binary Tree
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- 新手推荐:Hadoop安装教程_单机/伪分布式配置_Hadoop-2.7.1/Ubuntu14.04
下述教程本人在最新版的-jre openjdk-7-jdk OpenJDK 默认的安装位置为: /usr/lib/jvm/java-7-openjdk-amd64 (32位系统则是 /usr/lib/ ...
- oracle ebs应用产品安全性-安全性规则
定义: 通过为段指定包括下限值与上限值的值范围,可以定义安全性规则要素.安全性规则要素适用于包括在指定值范围内的所有段值. 可以将每个安全性规则要素标识为"包括"或"排除 ...
- memcached 详解
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...
- 【shell脚本练习】批量添加用户和设置密码
题目 添加9个用户,user101-user109:密码同用户名: 思路 for循环来添加就好了,用户名和密码都可以拼字符串来完成 user10+数字 要判断是否能添加成功,注意非交互模式下修改用户密 ...
- 基于VB中WINSOCK控件的网上象棋系统的实现
本文发表在<微型机与应用>杂志2001年第3期. 基于VB中WINSOCK控件的网上象棋系统的实现 马根峰1 , 孙艳2 , 王平1 (1.重庆邮电学院自动化学院,重庆,40006 ...
- Pollution over East China : Image of the Day
acquired October 16, 2002download large image (2 MB, JPEG, 6000x4600) acquired October 16, 2002downl ...