如这个类:
import java.util.*;
import java.lang.String;
public class Info {
Date date = null;
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
public List<String> getTimes(Integer in,String s){
date = new Date();
List<String> as = new ArrayList<String>();
as.add("s");
as.add("1");
return as;
}
}
我怎么得到所引用的类是:
java.util.Date,
java.util.List,
java,util.ArrayList,
java.lang.String,
java.lang.Integer;
我使用的是eclipse ast, 可以得到但是不对,比如:
得到字段申明:
1,Date date = null; //这个我只能得到类型为Date,而且不是java.util.Date,因此我无法知道,这 个Date是java.util.Date,还是java.sql.Date;
java.sql.Date sqlDate = new java.sql.Date(date.getTime()); //这个得到的类型就是直接是:java.sql.Date;
问题:请问这个应该怎么确定?
2,还有返回类型:public List<String> getTimes(Integer in,String s)。这个返回是List<String>,我这怎么确实这个带有泛型的类型?3,还有关于注解的类型,不过注解我想一定要先引入包吧。4,如果我在代中用到没有申明的类,应该怎么得到呢?如:
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
或者:
cal.setTimeInMillis(new Long(2134531215L));
这两种直接使用的应该怎么来得到?javaeclipseasteclipse ase
import java.util.*;
import java.lang.String;
public class Info {
Date date = null;
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
public List<String> getTimes(Integer in,String s){
date = new Date();
List<String> as = new ArrayList<String>();
as.add("s");
as.add("1");
return as;
}
}
我怎么得到所引用的类是:
java.util.Date,
java.util.List,
java,util.ArrayList,
java.lang.String,
java.lang.Integer;
我使用的是eclipse ast, 可以得到但是不对,比如:
得到字段申明:
1,Date date = null; //这个我只能得到类型为Date,而且不是java.util.Date,因此我无法知道,这 个Date是java.util.Date,还是java.sql.Date;
java.sql.Date sqlDate = new java.sql.Date(date.getTime()); //这个得到的类型就是直接是:java.sql.Date;
问题:请问这个应该怎么确定?
2,还有返回类型:public List<String> getTimes(Integer in,String s)。这个返回是List<String>,我这怎么确实这个带有泛型的类型?3,还有关于注解的类型,不过注解我想一定要先引入包吧。4,如果我在代中用到没有申明的类,应该怎么得到呢?如:
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
或者:
cal.setTimeInMillis(new Long(2134531215L));
这两种直接使用的应该怎么来得到?javaeclipseasteclipse ase
解决方案 »
- 关于hibernate hql执行外连接的问题,求教!!!
- java判断转义符,最好有给点代码,谢谢了
- 使用ResultSet的ResultSetMetaData获取表的元信息时一个怪异的问题
- 这些框架看什么书呀??100分
- 问一个distinct的问题,不知道有没有解决的办法?
- 如何把业务逻辑中得到的数据显示JSP页面中。
- 为什么从网上下的JAR文件,在执行时总提示:打不到main类?
- weblogic连接db28.1的问题
- Jbuilder7.0+weblogic7.0硬件配置如何???
- it allows appear once only.
- 关于activemq的返回数据问题
- jquery提交ognl表单的问题
反射后你用getGenericReturnType取返回值类型看看,别用getReturnType
写成 Date只是给程序写着和看着方便的,换句话,你不可能不知道它的具体类型是什么。2. 没太明白你关心什么,但是反射是可以得知一个类型是否是 泛型类的。3. 肯定要引入了。4.
反射,好像是得不方法体里面的代码所引用的类,情况4就是指的方法体里面的代码段,最明显的问题就是:我在java文件的开头,import java.util.*;
我在一个方法体中使用了,Set set = new HashSet();这个是正确的,但是我怎么得到一个java.util.Set这个类型呢? 因为在头文件中引用的是*,而不是Set,根据import得不到java.util.Set这个字符串。
总算大概明白你的困惑在那里了。生成CLASS字节码的时候JVM把类型都确定完了,字节码里没import。
你反射也反射不出来import是怎么写的的。你要的东西就是
System.out.println(Info.class.getClasses());
所有引用到的类都会返回,具体可以看getClasses()的注释:
按照你说的:Class<?>[] cs = Info.class.getClasses();
System.out.println(cs.length);输出是:0
eclipse ast: 只是分析出每一行代码,并不能得到代码所引的类的全名。
asm:是中间字节码,现在正在研究中。
LZ还在纠结啊,如果你要分析字节码,就用 javap -c -verbose [CLASS NAME] 命令就足够好使了
main 方法:public static Set<String> main(String[] args) throws IOException{
//xm.referencepackage.views.ReferencePackageView 需要解析的类名。fullname
ClassReader cr = new ClassReader("xm.referencepackage.views.ReferencePackageView");
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
MyClassAdapter classAdapter = new MyClassAdapter(cw);
cr.accept(classAdapter, ClassReader.SKIP_DEBUG);
Set<String> pkgs = classAdapter.getPackages();
return pkgs;
}
MyClassAdapter 继承:ClassVisitor
import static org.objectweb.asm.Opcodes.ASM4;import java.util.HashSet;
import java.util.Set;import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.tree.MethodNode;
public class MyClassAdapter extends ClassVisitor{
private Set<String> packages = new HashSet<String>();
public MyClassAdapter(ClassVisitor cv) {
super(ASM4,cv);
} public Set<String> getPackages(){
return packages;
}
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces){
//打印出类的一些基本信息
System.out.println("version:"+version+" access:"+access+" name:"+name+" signature:"+signature+" superName:"+superName);
}
//访问全局变量
public FieldVisitor visitField(int access, String name, String desc,
String signature, Object value)
{
//
System.out.println("Field:"+name+" desc:"+desc+" signature:"+signature+" value:"+value);
return cv.visitField(access, name, desc, signature, value);
}
//访问方法
public MethodVisitor visitMethod(int access, String name,
String desc, String signature, String[] exceptions){
System.out.println("Method:"+name+" desc:"+desc+" signature:"+signature+" exceptions:"+exceptions);
//访问方法体
MethodBodyAdapter mba = new MethodBodyAdapter(ASM4,access,name,desc,signature,exceptions,this.packages);
return mba;
}
//访问类注解
public AnnotationVisitor visitAnnotation(String name,
boolean visible){
System.out.println("Annotation:"+name+" desc:"+visible);
return cv.visitAnnotation(name, visible);
}
}MethodBodyAdapter 继承: MethodNode
import java.util.Iterator;
import java.util.Set;import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.FieldInsnNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.TypeInsnNode;
import org.objectweb.asm.tree.VarInsnNode;public class MethodBodyAdapter extends MethodNode {
private Set<String> packages = null;
public MethodBodyAdapter(int api, int access, String name, String desc, String signature, String[] exceptions,Set<String> packages){
super(api, access, name, desc, signature, exceptions);
this.packages = packages;
}
public Set<String> getPackages(){
return packages;
}
//访问每条代码段:
public void visitInsn(int opcode){
System.out.println("visitInsn:"+this.name);
Iterator<AbstractInsnNode> itr = this.instructions.iterator(0);
while (itr.hasNext()) {
AbstractInsnNode insn = itr.next();
switch (insn.getType()) {
case AbstractInsnNode.FIELD_INSN:{
//System.out.println("FIELD_INSN:"+AbstractInsnNode.FIELD_INSN);
String pkg = ((FieldInsnNode) insn).desc;
System.out.println(desc);
}
break;
case AbstractInsnNode.METHOD_INSN :{
//System.out.println("METHOD_INSN:"+AbstractInsnNode.METHOD_INSN);
System.out.println(((MethodInsnNode) insn).owner);
}
break;
case AbstractInsnNode.TYPE_INSN :{
//System.out.println("TYPE_INSN:"+AbstractInsnNode.TYPE_INSN);
System.out.println(((TypeInsnNode)insn).desc);
}
break;
// case AbstractInsnNode.VAR_INSN :{
// System.out.println("VAR_INSN:"+AbstractInsnNode.VAR_INSN);
// VarInsnNode vinsn = ((VarInsnNode) insn);
//
// }
// break;
//
// case AbstractInsnNode.LABEL :{
// System.out.println("LABEL:"+AbstractInsnNode.LABEL);
// LabelNode label = (LabelNode) insn;
// }
// break;
//
// case AbstractInsnNode.LDC_INSN :{
// System.out.println("LDC_INSN:"+AbstractInsnNode.LDC_INSN);
// LdcInsnNode ldc = (LdcInsnNode) insn;
// }
// break;
default:
break;
}
}
}}
如上可以基本得到所有引用的类:目前测试到下面一种情况的引用类得不到:
在方法体里面,如下代码片段:List<SomeClass> list = new ArraryList<SomeClass>();
list.add(SomeClassGenerator.getSomeClass);这个SomeClass得到不。求大神指定 ,在此标记。