java中反射的三种方法是

java中反射的三种方法是,第1张

第一种:通过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#通过反射获取不同命名空间下的类(属性和方法)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9712845.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存