黑马程序员_JAVA学习笔记6
来源:互联网 发布:极光数据恢复软件官网 编辑:程序博客网 时间:2024/06/05 14:59
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
反射:JAVA 中,无论生成某个类的多少个对象,这些对象都会对应于同一个Class对象。
例子:
public class InvokeTest
{
public int add(int param1,int param2)
{
return param1 + param2;
}
public String echo(String message)
{
return "hello:" + message;
}
public static void main(String[] args)
{
Class<?> classType = Class.forName(args[0]);
Class<?> classType2 = InvokeTest.class;
上面 为两种 得到 Class对象的方式。
获取某个类或某个对象所对应的Class对象的常用3种方式:
1) 使用Class类的静态方法 forName:Class.forName(“java.lang.String”);
2) 使用.class语法:String.class
3) 使用对象的getClass()方法:String s = “aa”; CClass<?> cla = s.getClass();
public class InvokeTest{
public int add(int param1,int param2)
{
return param1 + param2;
}
public String echo(String message)
{
return "hello:" + message;
}
public static void main(String[] args)
{
Class<?> classType2 = Class.forName(args[0]);
Class<?> classType = InvokeTest.class;
Object invokeTest = classType.newInstance();
Method addMethod = classType.getMethod("add", new Class[]{int.class,int.class});
Object result = addMethod.invoke(invokeTest, new Object[]{1,2});
System.out.println((Integer)result);
System.out.println("------------");
Method echoMethod = classType.getMethod("echo", new Class[]{String.class});
Object result2 = echoMethod.invoke(invokeTest, new Object[]{"tom"});
System.out.println((String)result2);
若想通过类的不带参数的构造方法来生成对象,我们有两种方式:
1.先获得Class对象,然后通过该Class对象的newInstance()方法直接生成即可:
Class<?> classType = String.class;
Object obj = classType.newInstance();
2.先获得Class对象,然后通过该对象获得对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成:
Class<?> classType = Customer.class;
Constructor cons = classType.getConstructor(new Class[]{});
Object obj = cons.newInstance(new Object[]{});
若想通过类的带参数的构造方法生成对象,只能使用下面这一种方式:
Class<?> classType = Customer.class;
Constructor cons = classType.getConstructor(new Class[]{String.class,int.class});
Object obj = obj = cons.newInstance(new Object[] {"hello",3});
通过反射访问私有方法:
public static void main(String[] args) throws Exception
{
Private p = new Private();
Class<?> classType = p.getClass();
Method method = classType.getDeclaredMethod("sayHello",new Class[] {String.class});
//压制java的访问控制检查
method.setAccessible(true);
String str = (String)method.invoke(p,new Object[]{"zhangsan"});
System.out.println(str);
}
Class class十分特殊。它和一般classes一样继承自Object,其实体用以表达java程序运行时的class和interfaces,也用来表达enum、array、primitive java types 能及关键词void.当一个class被加载,或当加载器的defineClass()被JVM调用,JVM便自动产生一个Class object。如果您想借由修改JAVA标准库源码来观察Class object 的实际生成时机,不能够!因为class并没有public constructor。
- 黑马程序员_JAVA学习笔记6
- 黑马程序员_java学习笔记
- 黑马程序员_JAVA 学习笔记19 WEB篇6
- 黑马程序员_Java高新技术部分学习笔记
- 黑马程序员_java学习笔记四
- 黑马程序员_java学习笔记01
- 黑马程序员_java学习笔记02
- 黑马程序员_java学习笔记03
- 黑马程序员_java学习笔记04
- 黑马程序员_java学习笔记05
- 黑马程序员_java学习笔记06
- 黑马程序员_java学习笔记07
- 黑马程序员_java学习笔记08
- 黑马程序员_java学习笔记09
- 黑马程序员_java学习笔记10
- 黑马程序员_java学习笔记11
- 黑马程序员_java学习笔记12
- 黑马程序员_java学习笔记13
- Android仿360悬浮框
- Spring MVC之注解Annonatoin之@SessionAttributes和@ModelAttribute
- 非广告!在360云盘建立了3个共享群,方便开发者交流共享资源
- sql数据库
- SAP阿拉伯数字转中文大写函数
- 黑马程序员_JAVA学习笔记6
- IOS 观察者模式
- Android 新浪微博第三方登录
- Objective-C相关Category的收集
- MAC下好用的svn2
- 黑马程序员-->12_JavaBean、内省
- 算法:N个人围成一个圈,逢3出列。求最后一人的编号。(约瑟夫环)
- Android px、dp、sp之间相互转换
- 《编程之美》寻找发帖水王扩展问题的代码实现