java中的反射机制是什么,有什么作用啊

java中的反射机制是什么,有什么作用啊,第1张

Method类中方法的使用(含代码和注释):

getMethods()获得本类及父类中的public权限修饰符方法

getDeclaredMethods()专门获得调用该方法的对象的本类中的所有方法包括private权限修饰符的方法

getDeclaredMethod(String name,class<>parameterTypes)

第一个参数:方法的名称

第二个参数:可变长度,写你要查找的那个方法的参数类型列表class

getParameterCount()得到方法的参数个数123456

package LessonForReflection03;import javalangreflectMethod;import javalangreflectModifier;abstract class Card{

private void creatRandomNumbers(int count)//private关键字

{

}

public void getFullCardsNumbers(String[] random, String pre_numbers)

{

}

public static void getUserInfor()

{

}

public abstract void getUserInfor(String tel);

public abstract void getUserInfor(int sal1, int sal2) throws ArrayIndexOutOfBoundsException,ArithmeticException;}public class MethodInforGetter {

public static void main(String[] args) 

{

Class<> c1 = Cardclass;

Systemoutprintln("-------------------------");

Method[] m1 = c1getMethods();//getMethods()获得本类及父类中的public方法!

for (Method m:m1)

{

Systemoutprintln(m);

}

Systemoutprintln("-------------------------");

Method[] m2 = c1getDeclaredMethods();//getDeclaredMethods()专门获得本类中的所有方法包括private!

for (Method m:m2)

{

Systemoutprintln(m);

}

Systemoutprintln("-------------------------");

/

getDeclaredMethod(String name,class<>parameterTypes)

第一个参数:方法的名称

第二个参数:可变长度,写你要查找的那个方法的参数类型列表

 getParameterCount()得到方法的参数个数

/

try 

{

Method m3 = c1getDeclaredMethod("getUserInfor");

Systemoutprintln(m3);

//getParameterCount()方法,获得方法参数个数

Systemoutprintln(m3getParameterCount());

Systemoutprintln(ModifiertoString(m3getModifiers()));//获得方法修饰符

Systemoutprintln(m3getReturnType());

Systemoutprintln("-------------------------");

Method m4 = c1getDeclaredMethod("getUserInfor", intclass,intclass);

//getExceptionTypes()可以获得初始化当前Method对象的给Class对象初始化的那个类的那个指定方法抛出的异常类型

Class<>[] exception = m4getExceptionTypes();

for (Class<> e:exception)

{

Systemoutprintln(e);

}

} catch (NoSuchMethodException | SecurityException e) 

{

eprintStackTrace();

}

}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788

Constructor类中的方法的使用>

javalangreflectConstructor:

Constructor[] getConstructor()获得本类里的public权限修饰符构造函数,不能获取父类的!

Constructor[] getDeclaredConstructor()获得本类中的所以构造函数!

Constructor<T> getConstructor(ClassparameterType)用参数决定获得本类中的某个的构造方法,只能获得public的

Constructor<T> getDeclaredConstructor(ClassparameterType)用参数决定获得本类中的某个构造方法

附:

JDK80之后新增的类:

Executable:

它是Method和Constructor的父类

常用方法:

getParameter()获得类中方法参数

getExceptionTypes()获得类中某个方法抛出异常类型

getMoidfiers()获得方法权限修饰符

Parameter:

封装并代表了参数实例123456789101112131415

package LessonForReflection03;import javalangreflectConstructor;import javalangreflectModifier;import javalangreflectParameter;/

 javalangreflectConstructor

 Constructor[] getConstructor();获得本类里的public权限修饰符构造函数,不能获取父类的

  Constructor[] getDeclaredConstructor();得本类里的全部构造

  Constructor<T> getConstructor(ClassparameterType);用参数决定获得哪个构造方法

  Constructor<T> getDeclaredConstructor(ClassparameterType);

/public class ConstructorInforGetter {

public static void main(String[] args) 

{

Systemoutprintln("获得Cricle本类里的public权限修饰符构造函数,不能获取父类的Constructor[] getConstructor()");

Systemoutprintln("子类继承不了父类中的构造方法和private");

//Constructor[] getConstructor()获得Cricle本类里的public权限修饰符构造函数,不能获取父类的

//子类继承不了父类中的构造方法和private

Class<Circle> c1 = Circleclass;

Constructor<>[] cons1 = c1getConstructors();

for (Constructor<> cons:cons1)

{

Systemoutprintln(cons);

//Systemoutprintln(consgetName());

}

Systemoutprintln("-----------------------");

Systemoutprintln("方法获得本类中的所有构造函数getDeclaredConstructor()");

Constructor<>[] cons2 = c1getDeclaredConstructors();

for (Constructor<> cons:cons2)

{

Systemoutprintln(cons);

}

Systemoutprintln("-----------------------");

try 

{

Systemoutprintln("方法用参数指定获得本类!构造方法,只能获取public的Constructor<T> getConstructor(ClassparameterType)");

Constructor<> cons3 = c1getConstructor(intclass);

Systemoutprintln(ModifiertoString(cons3getModifiers()));

Systemoutprintln(cons3);

Systemoutprintln("-----------------------");

Systemoutprintln("方法用参数指定获得本类!构造方法任何权限修饰符的都可以获得Constructor<T> getDeclaredConstructor(ClassparameterType)");

Constructor<> cons4 = c1getDeclaredConstructor(Stringclass);

Systemoutprintln(cons4);

Systemoutprintln("-----------------------");

/

 JDK80之后新增的类

 Executable:

 是Method和Constructor的父类

 方法:

 getParameter();

 getExceptionTypes();

 getModifiers();

          getTypeParameters();

  Parameter:

  封装并代表了参数实例

/

Systemoutprintln("获取类中方法的参数getParameters()");

Constructor<> cons5 = c1getDeclaredConstructor(intclass,Stringclass);

Parameter[] p1 = cons5getParameters();

for (Parameter p:p1)

{

Systemoutprintln(p);

}

} catch (NoSuchMethodException | SecurityException e) 

{

eprintStackTrace();

}

}}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687

代码中提到的Circle类和Shape类二者为继承关系:

package LessonForReflection03;public class Circle extends Shape{

private int r;

private String color;

public Circle(int r, String color) 

{

super();

thisr = r;

thiscolor = color;

}

public Circle(int r) 

{

super();

thisr = r;

}

protected Circle(String color) 

{

super();

thiscolor = color;

}

Circle()

{

super();

}}12345678910111213141516171819202122232425262728293031

package LessonForReflection03;public class Shape {

private int per;

public Shape(int per) 

{

super();

thisper = per;

}

public Shape() 

{

super();

}}1234567891011121314151617

部分文字来源于:

咕嘟咖啡杨海滨老师 — 《java编程语言高级特性》

轻量化研习Java相关技术倡导者

“爱码学院”联合创始人自适应教学理念提出者践行者;多年开发及项目管理经历;出版《JavaEE企业级应用与开发》一书;10余年高校项目实践毕设指导经验;企业软培经验丰富

package reflection;

import javalangreflectField;

import javalangreflectMethod;

/

该类主要练习使用java的反射机制调用其他类的

private方法和变量;

/

public class MethodTest

{

public static void main(String[] args) throws Exception

{

Class<> classType = Peopleclass;

People p1 =(People) classTypenewInstance();

// 获取指定的方法,调用People类的私有方法;

Method method = classTypegetDeclaredMethod("sayHello",

new Class[] { Stringclass });

methodsetAccessible(true);//压制java的访问修饰符;

methodinvoke(p1, new Object[]{"Mr zhou"});

//获取People类的私有属性;

Field field = classTypegetDeclaredField("age");

fieldsetAccessible(true);

fieldset(p1, 12);

Systemoutprintln(fieldget(p1));

}

}

class People

{

private int age;

private String name;

public int getAge()

{

return age;

}

public void setAge(int age)

{

thisage = age;

}

public String getName()

{

return name;

}

public void setName(String name)

{

thisname = name;

}

private void sayHello(String str)

{

Systemoutprintln("Hello: " + str);

}

}

可以看看这个 但是跟反射没什么关系。

利用多态,子类虽然访问不了父类的私有变量,但是可以通过方法访问,see

class a{

private int i = 11;

public void show(){

Systemoutprintln(i);

}

}

class b extends a{

private int j= 12;

public static void main(String[] args){

a aa = new b();

aashow();

}

}

成员变量和方法分为静态和实例变量和方法

例如定义一个类:

class Text

{

public static int number;

public int temp;

public static void method(){}

public void method2(){}

}

如果你想访问temp属性,你就必须先创建一个Text的对象,才能访问:Text b = new Text();

btemp;这就是实例成员变量。实例变量也是一样

而你想 访问number的话,不用创建Text的实例就可以访问,就像这样:Textnumber这就是类成员变量。实例方法也是一样

主要区别就是访问是需不需要创建对象,而对于类成员变量,所有对象是共享一个变量的。

以上就是关于java中的反射机制是什么,有什么作用啊全部的内容,包括:java中的反射机制是什么,有什么作用啊、java 如何调用一个私有方法里的私有成员变量、java 反射 访问父类私有成员等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/web/9446250.html

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

发表评论

登录后才能评论

评论列表(0条)

保存