各位大虾,哪有java反射讲解的书啊,实在是不懂
解决方案 »
- 关于数组的强制类型转换
- 一个线程执行完run()方法后,还能再调用start()方法么??
- 如何将Java程序转化成NT系统服务?
- 关于窗体的两个问题!
- 在Derby数据库中联表查询的时候遇到两个表中相同的列名如何使用rs.getString(表名.列名查询)?表名.列名试过不行
- classpath配置
- 新手求教!怎样读取一个文件夹里所有文件的名字
- help ,一个关于java与Access连接的问题
- 请问各位老大在Debian Linux中,怎么设置jfreechart中文?现在显示都是框
- main函数中的参数args[]???
- 关于Servlet程序
- 谁能给个完整的Tomcat数据库连接池的配置
Java Reflection in Action 这本书好像没有中文版 :(
检索类
1.获取一个Class对象
a)从对象的实例获取。
Class c = javax.swing.JButton.getClass();
b)从子类的实例获取
javax.swing.JButton but = new javax.swing.JButton();
Class c = but.getClass();//获取本类
Class s = c.getSuperclass();//获取父类
c)知道类名,则可以把.class加入到名字之后来获取。
Class c = java.awt.Button.class;
d)如果类名在编译时是未知的,则可以使用Class.forName()方法来获取.
Class c = Class.forName(“javax.swing.JButton”);
2.获取指定类的类名称
javax.swing.JButton but = new javax.swing.JButton();
Class c = t.getClass();//获取本类
String s = c.getName(); //获取名字
3.检索指定类的访问修饰符
通过getModifiers()方法获取一个整型标识值。
通过java.reflect.Modifier对象的isPublic, isFinal等方法判断此值.
例如 :
package com.text;import java.lang.reflect.Modifier;
import javax.swing.JButton;public class JavaEcho {
public void textClass(){
String s = "qwe";
int m = s.getClass().getModifiers();
if(Modifier.isPublic(m)){
System.out.println("public");
}
if(Modifier.isPrivate(m)){
System.out.println("private");
}
if(Modifier.isFinal(m)){
System.out.println("final");
}
}
public static void main(String[] args) {
new JavaEcho().textClass();
}
}
显示结果 :public
final
4. 检索指定类的父类
package com.text;import java.lang.reflect.Modifier;
import javax.swing.JButton;public class JavaEcho {
public void textClass(){
javax.swing.JButton but = new JButton();
Class subC = but.getClass();
Class superC = subC.getSuperclass();
while(superC!= null){
System.out.println("子类名----->"+subC.getName());
System.out.println("父类名----->"+superC.getName());
System.out.println("=============================");
subC = superC;
superC = subC.getSuperclass();
}
}
public static void main(String[] args) {
new JavaEcho().textClass();
}
}
显示结果:
子类名----->javax.swing.JButton
父类名----->javax.swing.AbstractButton
=============================
子类名----->javax.swing.AbstractButton
父类名----->javax.swing.JComponent
=============================
子类名----->javax.swing.JComponent
父类名----->java.awt.Container
=============================
子类名----->java.awt.Container
父类名----->java.awt.Component
=============================
子类名----->java.awt.Component
父类名-----> java.lang.Object
=============================5. 检索指定类实现的接口
package com.text;import java.lang.reflect.Modifier;
import javax.swing.JButton;public class JavaEcho {
public void textClass(){
javax.swing.JButton but = new JButton();
Class subC = but.getClass();
Class[] in = subC.getInterfaces();
for (int i = 0; i < in.length; i++) {
System.out.println(in[i].getName());
if(Modifier.isInterface(in[i].getModifiers())){
System.out.println("就是接口。");
}else{
System.out.println("不是接口。");
}
}
}
public static void main(String[] args) {
new JavaEcho().textClass();
}
}
显示结果:
javax.accessibility.Accessible
就是接口。
6. 检索指定类所有的属性
package com.text;import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import javax.swing.JButton;public class JavaEcho { public void textClass() {
javax.swing.JButton but = new JButton();
Class subC = but.getClass();
Field[] f = subC.getFields();
for (int i = 0; i < f.length; i++) {
//属性名
String name = f[i].getName();
//属性类型
String type = f[i].getType().getName();
//属性访问修饰符
String mod = "";
if (Modifier.isPublic(f[i].getModifiers())) {
mod = "public";
}
if (Modifier.isPrivate(f[i].getModifiers())) {
mod = "private";
}
if (Modifier.isFinal(f[i].getModifiers())) {
mod = "protected";
}
System.out.println(mod + " " + type + " " + name);
}
} public static void main(String[] args) {
new JavaEcho().textClass();
}
}
显示结果:
protected java.lang.String TEXT_CHANGED_PROPERTY
protected java.lang.String MNEMONIC_CHANGED_PROPERTY
...
protected int CENTER
protected int SOUTH_EAST
protected float TOP_ALIGNMENT
...
7.检索指定类的构造函数
package com.text;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import javax.swing.JButton;public class JavaEcho { public void textClass() {
javax.swing.JButton but = new JButton();
Class subC = but.getClass();
Constructor[] cons = subC.getConstructors();
for (int i = 0; i < cons.length; i++) {
//构造方法名
String name = cons[i].getName();
Class[] paras = cons[i].getParameterTypes();
//构造方法访问修饰符
String mod = "";
if (Modifier.isPublic(cons[i].getModifiers())) {
mod = "public";
}
if (Modifier.isPrivate(cons[i].getModifiers())) {
mod = "private";
}
if (Modifier.isFinal(cons[i].getModifiers())) {
mod = "protected";
}
//构造方法参数类型
String type="";
for (int j = 0; j < paras.length; j++) {
type += paras[j].getName();
}
System.out.println(mod+" "+name+"("+type +")");
}
} public static void main(String[] args) {
new JavaEcho().textClass();
}
}
显示结果:
public javax.swing.JButton(javax.swing.Icon)
public javax.swing.JButton(java.lang.String)
public javax.swing.JButton(javax.swing.Action)
public javax.swing.JButton()
public javax.swing.JButton(java.lang.Stringjavax.swing.Icon)
8.检索指定类的方法
package com.text;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import javax.swing.JButton;public class JavaEcho { public void textClass() {
javax.swing.JButton but = new JButton();
Class subC = but.getClass();
Method[] mets = subC.getMethods();
for (int i = 0; i < mets.length; i++) {
//方法名
String name = mets[i].getName();
Class[] paras = mets[i].getParameterTypes();
//方法访问修饰符
String mod = "";
if (Modifier.isPublic(mets[i].getModifiers())) {
mod = "public";
}
if (Modifier.isPrivate(mets[i].getModifiers())) {
mod = "private";
}
if (Modifier.isFinal(mets[i].getModifiers())) {
mod = "protected";
}
//返回值类型
String returnType = mets[i].getReturnType().getName();
//方法参数类型
String type="";
for (int j = 0; j < paras.length; j++) {
if(paras.length == 1){
type = paras[j].getName();
}else{
type += paras[j].getName();
if(j != paras.length-1){
type +=",";
}
}
}
System.out.println(mod+" "+returnType+" "+name+"("+type +")");
}
} public static void main(String[] args) {
new JavaEcho().textClass();
}
}
显示结果:
...
public void removeNotify()
public java.lang.String getUIClassID()
public void updateUI()
...
public void show(boolean)
public void show()操作类:
Class c = Class.forName(className);//指定类的运行实例
Object object = c.newInstance();//调用无参构造函数来生成指定类的实例。
照着做一便就会了··不难~~~