
第一种:通过forName()方法;
第二种:类class;
第三种:对象getClass()。
举例如下:
package
test;
public class Demo{
public static void
main(){
Class<> c1 = null;
Class<> c2 =
null;
Class<> c3 =
null;
//三种反射用实例化方式
try{
//最常用的一种形式
c1 =
ClassforName("testX");
}catch(ClassNotFoundException
e){
eprintStackTrace();
}
//通过Object类中的方法实例化
c2
= new X()getClass();
//通过类class实例化
c3 =
Xclass;
Systemoutprintln("类名:" + c1getName());
//得到类名
Systemoutprintln("类名:" + c2getName());
//得到类名
Systemoutprintln("类名:" + c3getName());
//得到类名
}
}
可以获取,你在B类建一个方法,然后new 一个A类对象a,然后aa就可以了
可以看看:
A类:
class A {
A1 a=new A1();
class A1{
public void sayHi(){
Systemoutprintln("hi!");
}
}
}
B类:
public class B {
public static void main(String[] args) {
A a=new A();
aasayHi();
}
}
结果:hi!
这个很简单,你别看写的这样,其实A类里面那个A1实例就是A类的一个变量而已。
请注意看异常信息。未能从“当前”程序集获取“外部”程序集中拥有指定完整限定名的类型。
事实上,直接使用TypeGetType()会从当前程序集,也就是"test3"程序集中查找。
想要查找NHapiModelV23程序集中的类型,请在该程序集上使用GetType
Assembly asmNHapi=AssemblyLoadFrom();Type outerType=asmNHapiGetType();
如果想尽量少的改动自己的代码也成,直接在你的var classes上进行linq查询就好。
Type[] classes=AssemblyLoadFrom()GetTypes();Type tt=classesFirstOrDefault(t=>tFullName="NHapiModelV23GroupORM_001_"+properties[i]);
if(tt!=null)
DoSomething();
最后提醒,请勿使用AssemblyLoad方法,因为该方法已被弃用,请使用LoadFrom和LoadFile来加载外部程序集。
此外,类型的完全限定名和短名并不影响类型的搜索。使用GetType时会从根命名空间开始一层一层查找的,如果各层命名空间下没有重名的类,你甚至没有使用完全限定名的必要。比如上面的代码里可以使用短名进行查找。
Type tt=classesFirstOrDefault(t=>tName="ORM_001_"+properties[i]);刚看到上面的回答,这里我要肯定的告诉你,不管你是用文件方式还是项目引用方式,都不可能使用TypeGetType静态方法获取另一个程序集中的类型,必须在对方的程序集上进行查找!
如果你非要使用TypeGetType静态方法获取其他程序集中的类型,可以使用其的一种重载:
public static SystemType GetType(string typeName, SystemFunc<AssemblyName,Assembly> assemblyResolver, SystemFunc<Assembly,string,bool,Type> typeResolver)该静态方法要求你提供自己的程序集名称解析器和类型名称解析器,非特殊情况不推荐使用。该方法是为了在多个程序集中同时查找多个类型而被微软提供的。
class OuterClass{
class NestClass{}
}
public static void main(String args[]) throws Exception{
try{
Class cls=ClassforName("OuterClass");
Class arrClass[]=clsgetDeclaredClasses();
for(Class obj:arrClass){
Systemoutprintln("Nest Class="+objgetName());
}
}catch(SecurityException se){
Systemoutprintln(setoString());
}catch(Exception e){
Systemoutprintln(etoString());
}
}
获取当前线程的ClassLoader,通过ClassLoader获取当前工作目录,对目录下的文件进行遍历扫描。过滤出以class为后缀的类文件,并加载类到list中,对list中所有类进行校验,判断是否为指定接口的实现类,并排除自身。返回所有符合条件的类。
这个方没有考虑不同的文件格式。当程序打成jar包,发布运行时,上述的这种遍历file的 *** 作就失效了。只能扫描到当前方法的同级目录及其子目录。无法覆盖整个模块,遍历文件的逻辑太啰嗦,可以简化。
扩展资料:
Java使用注意事项:
1、如果没有定义环境变量classpath,java启动jvm后,会在当前目录下查找要运行的类文件。
2、如果指定了classpath,那么会在指定的目录下查找要运行的类文件。
3、PATH环境变量。作用是指定命令搜索路径,在命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。
4、需要把jdk安装目录下的bin目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待,设置好PATH变量后,就可以在任何目录下执行javac/java等工具了。
以上就是关于java中反射的三种方法是全部的内容,包括:java中反射的三种方法是、怎样获取 一个类的 外部类的内部类对象 例如(代码如下)、C#通过反射获取不同命名空间下的类(属性和方法)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)