我的java学习笔记(14)关于反射(part 3)

1.java.lang.reflect包中的Array类允许动态地创建数组。

2.在调用Array类中的静态方法newInstance是需要提供两个参数,一个是数组的元素类型,一个是数组的长度。

3.Class类的getComponentType方法可以确定数组对应的类型。

4.整型数组类型int[]可以被转换成Object,但不能转换成对象数组。

相关的实例代码

import java.lang.reflect.*;
import java.util.*;

public class test
{
	public static void main(String[] args)
	{
		int[] a = {1,2,3};
		a = (int[])goodCopyOf(a,10);
		System.out.println(Arrays.toString(a));

		String[] b = {"one","two","three"};
		b = (String[]) goodCopyOf(b,10);
		System.out.println(Arrays.toString(b));

		System.out.println("下面这个方法将产生一个异常:");
		b = (String[])badCopyOf(b,10);

	}

	public static Object[] badCopyOf(Object[] a,int newLength)
	{
		Object[] newArray = new Object[newLength];
		System.arraycopy(a, 0, newArray, 0, Math.min(a.length, newLength));
		return newArray;
	}

	public static Object goodCopyOf(Object a,int newLength)
	{
		Class c1 = a.getClass();
		if(!c1.isArray())
			return null;
		Class componentType = c1.getComponentType();
		int length = Array.getLength(a);
		Object newArray = Array.newInstance(componentType,newLength);
		System.arraycopy(a,0,newArray,0,Math.min(length, newLength));
		return newArray;
	}
}

输出结果

5.Method类中的invoke方法可以调用包装在当前Method对象中的方法。

6.如果返回值是基本类型,invoke方法会返回其包装器类型。

相关的实例代码

import java.lang.reflect.*;

public class test {
	public static void main(String[] args) throws Exception
	{
		Method squ = test.class.getMethod("square", double.class);
		Method sqr = Math.class.getMethod("sqrt",double.class);

		printTable(1,10,10,squ);
		printTable(1,10,10,sqr);
	}

	public static double square(double x)
	{
		return x*x;
	}

	public static void printTable(double begin,double end,int n,Method f)
	{
		double dx = (end - begin)/(n - 1);

		for(double x = begin; x <= end;x += dx)
		{
			try
			{
				double y =(Double) f.invoke(null, x);
				System.out.printf("%10.4f | %10.4f%n" , x, y);
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
	}
}

输出结果

时间: 2024-08-05 00:15:36

我的java学习笔记(14)关于反射(part 3)的相关文章

JAVA学习笔记(六十一)- 反射Reflection

反射Reflection import java.lang.reflect.Modifier; /* * 反射Reflection * java.lang.Class类 */ public class Test01 { public static void main(String[] args) { String name = "tom"; // 方式一:通过对象getClass()方法 // 任意一个类的对象,都有一个getClass()方法 // 可以通过此获取获取当前对象的类型所

我的java学习笔记(12)关于反射(part 1)

1.能够分析类能力的程序称为反射. 2.在程序运行期间,java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着每个对象所属的类.虚拟机利用运行时类型信息选择相应的方法执行. 3.这些保存信息的类被称为Class. 4.Object类中的getClass()方法将会返回一个Class类型的实例. String s = "hello"; Class c1 = s.getClass(); 5.如果类在一个包里,包的名字也作为类名的一部分. 6.获得类名的三种方法 a

Java学习笔记54(反射详解)

反射概念: java反射机制是在运行状态中,对于任意一个类,都能知道所有属性和方法 对于任意一个对象都能调用它的任意一个方法和属性,这种动态获取和调用的功能称为java的反射机制 实际作用: 已经完成一个java程序,但是想再添加新功能,又不能修改源码,这时候就用到反射机制了 获取class文件的三种方式: 简单地自定义一个Person类: package demo; public class Person { public String name; private int age; publi

我的java学习笔记(13)关于反射(part 2)

呜呜呜...今天因为晚上有点事...结果在实验室没有eclipse,用的命令行,结果环境变量没配好,搞了半天..弄到现在..哎.. 1.查看对象域的关键方法是Field类中的get方法. Field f = c1.getDeclareFields("name"); Object value = f.get(obj); //value是obj 中name域的当前值. 2.反射机制的默认行为受限于java的访问控制. 3.如果一个java程序没有受到安全管理器的控制,就可以覆盖访问控制.

Java学习笔记14

Object类是所有类.数组.枚举类的父类,是类层次结构的根类.每个类都使用Object作为超类.所有对象(包括 数组)都实现这个类的方法. Object类实现了以下方法: 我们来看看源码中clone()方法是如何定义的: protected native Object clone() throws CloneNotSupportedException; 我们看到clone()方法前用了native来修饰,说明native方法的效率一般来说高于Java中的非native方法.其次用了 prote

java学习笔记 第二篇 核心技术(二)

第十四章 集合类 集合类用来存放对象的引用.继承关系如下图: 14.1 Collection 接口 是层次结构中的根接口,构成Collection的单位称为元素.Collection接口不能直接使用,但该接口提供了添加元素.删除元素.管理数据的方法. Collection接口常用方法: 14.2 List 集合 包括List接口以及List集合的所有实现类.List集合中的元素允许重复,各元素循序就是对象插入的顺序 1.List接口,两个重要方法: get(int index): 获取指定索引位

Java学习笔记——动态代理

所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记--RMI"中的远程代理,其中客户端服务对象就是一个远程服务对象的代理,这个代理可以使得客户在操作时感觉像在操作本地对象一样,远程对象对于客户是透明的.我们可以看出这里的远程代理,是在程序中事先写好的,而本节我们要讨论的远程代理,是由JVM根据反射机制,在程序运行时动态生成的.(以上是本人的理解,如果有不正确的地

java学习笔记8--接口总结

接着前面的学习: java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3--类与对象的基础 java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址:http://www.cnblogs.com/archimedes/p/java-study-note8.html,转载请注明源地址. 生活中的接口: 什么是接口? 一个Java接口是一些方法特

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my