java 为什么需要反射,为什么使用java反射
大家好,今天小编来为大家解答以下的问题,关于java 为什么需要反射,为什么使用java反射这个很多人还不知道,现在让我们一起来看看吧!
java中的反射机制是什么,有什么作用啊
Method类中的方法的使用(含代码和注释):
getMethods()获得本类及父类中的public权限修饰**符方法
getDeclaredMethods()专门获得调用该方法的对象的本类中的所有方法包括private权限修饰符**的方法
getDeclaredMethod(Stringname,class<?>...parameterTypes)
第一个参数:方法的名称
第二个参数:可变长度,写你要查找的那个方法的参数类型列表.class
getParameterCount()得到方法的参数个数123456
packageLessonForReflection03;importjava.lang.reflect.Method;importjava.lang.reflect.Modifier;abstractclassCard{
privatevoidcreatRandomNumbers(intcount)//private关键字
{
}
publicvoidgetFullCardsNumbers(String[]random,Stringpre_numbers)
{
}
publicstaticvoidgetUserInfor()
{
}
publicabstractvoidgetUserInfor(Stringtel);
publicabstractvoidgetUserInfor(intsal1,intsal2)throwsArrayIndexOutOfBoundsException,ArithmeticException;}publicclassMethodInforGetter{
publicstaticvoidmain(String[]args)
{
Class<?>c1=Card.class;
System.out.println("-------------------------");
Method[]m1=c1.getMethods();//getMethods()获得本类及父类中的public方法!
for(Methodm:m1)
{
System.out.println(m);
}
System.out.println("-------------------------");
Method[]m2=c1.getDeclaredMethods();//getDeclaredMethods()专门获得本类中的所有方法包括private!
for(Methodm:m2)
{
System.out.println(m);
}
System.out.println("-------------------------");
/*
*getDeclaredMethod(Stringname,class<?>...parameterTypes)
*第一个参数:方法的名称
*第二个参数:可变长度,写你要查找的那个方法的参数类型列表
*
*getParameterCount()得到方法的参数个数
*/
try
{
Methodm3=c1.getDeclaredMethod("getUserInfor");
System.out.println(m3);
//getParameterCount()方法,获得方法参数个数
System.out.println(m3.getParameterCount());
System.out.println(Modifier.toString(m3.getModifiers()));//获得方法修饰符
System.out.println(m3.getReturnType());
System.out.println("-------------------------");
Methodm4=c1.getDeclaredMethod("getUserInfor",int.class,int.class);
//getExceptionTypes()可以获得初始化当前Method对象的给Class对象初始化的那个类的那个指定方法抛出的异常类型
Class<?>[]exception=m4.getExceptionTypes();
for(Class<?>e:exception)
{
System.out.println(e);
}
}catch(NoSuchMethodException|SecurityExceptione)
{
e.printStackTrace();
}
}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
Constructor类中的方法的使用www.xiaoyuani.com(含代码和注释):
java.lang.reflect.Constructor:
Constructor[]getConstructor()获得本类里的public权限修饰符构造函数,不能获取父类的!
Constructor[]getDeclaredConstructor()获得本类中的所以构造函数!
Constructor<T>getConstructor(Class...parameterType)用参数决定获得本类中的某个的构造方法,只能获得public的
Constructor<T>getDeclaredConstructor(Class...parameterType)用参数决定获得本类中的某个构造方法
附:
JDK8.0之后新增的类:
Executable:
它是Method和Constructor的父类
常用方法:
getParameter()获得类中方法参数
getExceptionTypes()获得类中某个方法抛出异常类型
getMoidfiers()获得方法权限修饰符
Parameter:
封装并代表了参数实例123456789101112131415
packageLessonForReflection03;importjava.lang.reflect.Constructor;importjava.lang.reflect.Modifier;importjava.lang.reflect.Parameter;/*
*java.lang.reflect.Constructor
*
*Constructor[]getConstructor();获得本类里的public权限修饰符构造函数,不能获取父类的
*Constructor[]getDeclaredConstructor();得本类里的全部构造
*
*Constructor<T>getConstructor(Class...parameterType);用参数决定获得哪个构造方法
*Constructor<T>getDeclaredConstructor(Class...parameterType);
*
*/publicclassConstructorInforGetter{
publicstaticvoidmain(String[]args)
{
System.out.println("获得Cricle本类里的public权限修饰符构造函数,不能获取父类的Constructor[]getConstructor()");
System.out.println("子类继承不了父类中的构造方法和private");
//Constructor[]getConstructor()获得Cricle本类里的public权限修饰符构造函数,不能获取父类的
//子类继承不了父类中的构造方法和private
Class<Circle>c1=Circle.class;
Constructor<?>[]cons1=c1.getConstructors();
for(Constructor<?>cons:cons1)
{
System.out.println(cons);
//System.out.println(cons.getName());
}
System.out.println("-----------------------");
System.out.println("方法获得本类中的所有构造函数getDeclaredConstructor()");
Constructor<?>[]cons2=c1.getDeclaredConstructors();
for(Constructor<?>cons:cons2)
{
System.out.println(cons);
}
System.out.println("-----------------------");
try
{
System.out.println("方法用参数指定获得本类!构造方法,只能获取public的Constructor<T>getConstructor(Class...parameterType)");
Constructor<?>cons3=c1.getConstructor(int.class);
System.out.println(Modifier.toString(cons3.getModifiers()));
System.out.println(cons3);
System.out.println("-----------------------");
System.out.println("方法用参数指定获得本类!构造方法任何权限修饰符的都可以获得Constructor<T>getDeclaredConstructor(Class...parameterType)");
Constructor<?>cons4=c1.getDeclaredConstructor(String.class);
System.out.println(cons4);
System.out.println("-----------------------");
/*
*JDK8.0之后新增的类
*Executable:
*是Method和Constructor的父类
*方法:
*getParameter();
*getExceptionTypes();
*getModifiers();
*getTypeParameters();
*
*Parameter:
*封装并代表了参数实例
*/
System.out.println("获取类中方法的参数getParameters()");
Constructor<?>cons5=c1.getDeclaredConstructor(int.class,String.class);
Parameter[]p1=cons5.getParameters();
for(Parameterp:p1)
{
System.out.println(p);
}
}catch(NoSuchMethodException|SecurityExceptione)
{
e.printStackTrace();
}
}}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
代码中提到的Circle类和Shape类二者为继承关系:
packageLessonForReflection03;publicclassCircleextendsShape{
privateintr;
privateStringcolor;
publicCircle(intr,Stringcolor)
{
super();
this.r=r;
this.color=color;
}
publicCircle(intr)
{
super();
this.r=r;
}
protectedCircle(Stringcolor)
{
super();
this.color=color;
}
Circle()
{
super();
}}12345678910111213141516171819202122232425262728293031
packageLessonForReflection03;publicclassShape{
privateintper;
publicShape(intper)
{
super();
this.per=per;
}
publicShape()
{
super();
}}1234567891011121314151617
部分文字来源于:
咕嘟咖啡杨海滨老师—《java编程语言高级特性》
轻量化研习Java相关技术倡导者
“爱码学院”联合创始人自适应教学理念提出者践行者;多年开发及项目管理经历;出版《JavaEE企业级应用与开发》一书;10余年高校项目实践毕设指导经验;企业软培经验丰富
JAVA反射为什么总要异常处理
JAVA中的异常和反射
一、异常
1
、异常概貌:
概念: JAVA会将所有的异常、错误抽象成为一个类,其根本父类为Throwable。异常是程
序中所有出乎意料的结果,用名称代表发生的问题,见名知义。我们对于程序可能出现的错
误应该做出预案。异常处理可以提高我们系统的容错性、健壮性。
java.lang.Throwable类是所有异常和错误的顶层类。其两个直接子类是java.lang.Error和
java.lang.Exception。
Error
对象表示程序错误,是底层的、不可恢复的严重错误。此时程序一定会退出,
已经失去了运行所必须的物理环境。因为程序已经退出了,所以对于Error错误无法进
行处理。
我们可处理的只是Exception
类的对象表示的程序异常(例外/异常)。
以下区分:
RuntimeException
(未检查异常):RuntimeException及其子类都称为运行时异常,它
是(UnChecked Exception),特点是Java编译器不会检查它,可以在编程时避免。也就
是说,当程序中出现此类异常时,即使不用try…catch捕获,或不用throws子句抛出,
还是可以编译通过。比如,除数为0的异常ArrithmeticException,就是运行时异常。
非Runtime
异常(已检查异常):包括除了RuntimeException及其子类外的其它Exception
类及其子类,都属于已检查异常(Checked Exception)。其特点是Java编译器会检查它,
我们需要用try…catch语句捕获,或用throws子句声明抛出,否则编译不会通过。比如
打开文件时找不到文件,就属于已检查异常。
Throwable
Error
错误
严重底层错误
不可避免
不可处理
Exception
异常
RuntimeException
未检查异常
(可处理可不处理)
比如除0错误、空指针
非Runtime
已检查异常
(必须处理)
比如打开文件时找不到
2
2
、Java
异常处理机制
(1
)try
…
catch
捕获异常(积极处理异常的方式)
try代码块包含了可能发生异常的程序代码,catch块紧随其后,用来捕获并处理异常。
格式如下:
try
{
可能出现异常的代码块}
catch
(Exception
e)
{
进行异常处理}
注意:一次异常捕获只会匹配一次try…catch
catch中要求必须先捕获子类异常再捕获父类异常。
(2
)finally
任何情况下都必须执行的代码段(紧接在try或catch代码块后面)。
finally无论如何都会被执行,除非JVM退出。所以,finally代码块常常用于释放被占
用的资源。比如关闭文件、网络、数据库连接等。
(3
)throws
声明可能会抛出的异常(消极处理异常的方式)
格式:方法名(参数表)throws
后面接要往上抛的异常。
表示该方法对指定的异常不作任何处理,直接抛往上一层。
static void methodA(int i) throws IOException{//一直向上抛(消极处理)
}
public static void main(String[] args) throws IOException{//一直抛到JVM
}
多个异常,用逗号隔开。throws IOException, SQLException
throws后的异常允许多态。比如IOException,会包括抛出其子类。
注意:不允许子类比父类抛出范围更大、更多的异常。
方法覆盖时,修饰符要越来越宽;抛例外则要越来越窄。
throws
和try
…
catch
经常配合使用,把异常传递给最能处理此异常的方法中,体现各
司其职的特点。
Java
中处理异常方式
消极throws用在方法的声明上
积极try…catch…finally
public static int fn(int b){
try{
return b/2;
}catch(Exception e){
return 0;
}finally{
return b;//返回的结果是一定是b;
}
}
3
(4
)throw
抛出异常
打个比方:
public void eat() throws FoodException{//自定义FoodException是以下异常的父类
if(没有食物) throw new NoFoodException(“呵呵,没有食物”);
if(发现苍蝇) throw new FoundFlyException(“哎呀,发现半只苍蝇”);
}
比较throw
和throws
:
throw
是一个语句,它出现在方法体中,用来抛出异常对象。
throws
是出现在方法声明中,表示本方法中会有异常对象向上(调用者)抛出。
throws
后写的是异常类型; throw
后写的是要抛出的异常对象。
(5
)异常处理流程
try…catch…finally,如果遇到return和System.exit()语句:
一如果在finally之前遇到System.exit()则finally语句不再执行,这是finally不被执行
的唯一情况。因为java.lang.System类的静态方法exit()用于终止当前的Java虚拟机进程。exit()
的参数表示程序终止时的状态码,0表示正常终止,非0表示异常终止。
二return语句用于退出本方法。如果在try或者catch代码块中遇到return语句时,若
有finally语句块,会先执行finally代码块。
三不要在finally代码块中使用return语句。因为这样会导致两种潜在错误:A.覆盖了
try或catch块中的return语句; B.导致丢失异常。
try{
①
②
③
} catch(XxxException e){
④
} finally{
⑤
}
⑥
情况一:没有异常,处理顺序为①②③⑤⑥
情况二:在②处有异常,①②④⑤⑥
情况三:有异常,没有被捕获,①②⑤终止
情况四:如果③后有return语句,①②③⑤
情况五:如果遇到System.exit(),则⑤不执行
允许的处理方式:
① try…catch()
② try…finally//与throws配合使用
③ try…catch…finally
④ try…catch(){} catch(){}…//配多个catch
//注意范围大的异常要写在后面
4
(6
)异常处理规则:
①只有在异常情况下才使用异常处理机制;
②保证操作要么一起成功,要么一起失败;
③ try代码块不要太大;
④ catch子句中指定具体的异常类型;
⑤早抛出,晚捕获。
3
为什么使用java反射
Java反射最大的好处就是能在运行期间,获得某个类的结构、成员变量,用来实例化。
下列是具体使用场景:假如我们有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码能否通过编译呢?这是不能通过编译的。利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译。Java的反射机制它知道类的基本结构,这种对Java类结构探知的能力,我们称为Java类的“自审”。大家都用过Jcreator和eclipse。当我们构建出一个对象的时候,去调用该对象的方法和属性的时候。一按点,编译工具就会自动的把该对象能够使用的所有的方法和属性全部都列出来,供用户进行选择。这就是利用了Java反射的原理,是对我们创建对象的探知、自审。
好了,文章到此结束,希望可以帮助到大家。