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 ...
随机推荐
- iOS视图控制器初始化问题
最近在群里见不少人 问到用视图控制器的alloc /init方法初始化的时候,出来的是黑色的空界面.之前我也遇到过,所以在这里总结下. 我们在项目中肯定都会用到自定义的ViewController,而 ...
- 极光推送---安卓Demo
对于一个一直干.net的程序媛来说,冷不丁的让小编干安卓,那种感觉就好似小狗狗咬小刺猬一样,不知道从哪儿开始下手,对于小编来说,既是挑战更是机遇,因为知识都是相通的,再者来说,在小编的程序人生中,留下 ...
- Java进阶(三十四)Integer与int的种种比较你知道多少?
Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...
- NoSQL数据库之Redis数据库:Redis的介绍与安装部署
NoSQL(NoSQL = Not Only SQL),它指的是非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的w ...
- [Err] 1093 - You can't specify target table 's' for update in FROM clause
[Err] 1093 - You can't specify target table 's' for update in FROM clause 执行SQL DELETE from book WHE ...
- Deep Learning with Torch
原文地址:https://github.com/soumith/cvpr2015/blob/master/Deep%20Learning%20with%20Torch.ipynb Deep Learn ...
- 从JDK源码角度看并发锁的优化
在CLH锁核心思想的影响下,JDK并发包以CLH锁作为基础而设计,其中主要是考虑到CLH锁更容易实现取消与超时功能.比起原来的CLH锁已经做了很大的改造,主要从两方面进行了改造:节点的结构与节点等待机 ...
- H5学习之旅-H5的基本标签(2)
H5的标签和html的标签没什么区别,主要介绍H5的基本标签 1.基础标签header和body,header的<title>元素主要是显示在标签页面里面,以及设置使用的语言和编码格式.b ...
- 【一天一道LeetCode】#80. Remove Duplicates from Sorted Array II
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Follow ...
- SpriteBuilder改变布局后App运行出错代码排查
原来整个关卡场景放在GameScene.ccb中,后来觉得移到专门的Level.ccb比较好. 移动过后编译运行,只要移动Player的胳膊发射子弹时,Xcode报错: g due to Chipmu ...