2018年9月

在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。

1. 尽量在合适的场合使用单例

使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:

第一,控制资源的使用,通过线程同步来控制资源的并发访问;

第二,控制实例的产生,以达到节约资源的目的;

第三,控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。

2. 尽量避免随意使用静态变量

当某个对象被定义为static变量所引用,那么GC通常是不会回收这个对象所占有的内存,如

public class A{ 
 
private static B b = new B(); 
 
} 

此时静态变量b的生命周期与A类同步,如果A类不会卸载,那么b对象会常驻内存,直到程序终止。

3. 尽量避免过多过常地创建Java对象

尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度地重用对象,最好能用基本的数据类型或数组来替代对象。

4. 尽量使用final修饰符

带有final修饰符的类是不可派生的。在JAVA核心API中,有许多应用final的例子,例如java、lang、String,为String类指定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关),此举能够使性能平均提高50%。

如:让访问实例内变量的getter/setter方法变成”final:

简单的getter/setter方法应该被置成final,这会告诉编译器,这个方法不会被重载,所以,可以变成”inlined”,例子:

class MAF { 
 
public void setSize (int size) { 
 
_size = size; 
 
} 
 
private int _size; 
 
} 
 
更正 
 
class DAF_fixed { 
 
final public void setSize (int size) { 
 
_size = size; 
 
} 
 
private int _size; 
 
} 

5. 尽量使用局部变量

调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快;其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。

6. 尽量处理好包装类型和基本类型两者的使用场所

虽然包装类型和基本类型在使用过程中是可以相互转换,但它们两者所产生的内存区域是完全不同的,基本类型数据产生和处理都在栈中处理,包装类型是对象,是在堆中产生实例。在集合类对象,有对象方面需要的处理适用包装类型,其他的处理提倡使用基本类型。

7. 慎用synchronized,尽量减小synchronize的方法

都知道,实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。synchronize方法被调用时,直接会把当前对象锁了,在方法执行完之前其他线程无法调用当前对象的其他方法。所以,synchronize的方法尽量减小,并且应尽量使用方法同步代替代码块同步。

9. 尽量不要使用finalize方法

实际上,将资源清理放在finalize方法中完成是非常不好的选择,由于GC的工作量很大,尤其是回收Young代内存时,大都会引起应用程序暂停,所以再选择使用finalize方法进行资源清理,会导致GC负担更大,程序运行效率更差。

10. 尽量使用基本数据类型代替对象

String str = "hello";

上面这种方式会创建一个“hello”字符串,而且JVM的字符缓存池还会缓存这个字符串;

String str = new String("hello");

此时程序除创建字符串外,str所引用的String对象底层还包含一个char[]数组,这个char[]数组依次存放了h,e,l,l,o

11. 多线程在未发生线程安全前提下应尽量使用HashMap、ArrayList

HashTable、Vector等使用了同步机制,降低了性能。

12. 尽量合理的创建HashMap

当你要创建一个比较大的hashMap时,充分利用这个构造函数

public HashMap(int initialCapacity, float loadFactor);

避免HashMap多次进行了hash重构,扩容是一件很耗费性能的事,在默认中initialCapacity只有16,而loadFactor是 0.75,需要多大的容量,你最好能准确的估计你所需要的最佳大小,同样的Hashtable,Vectors也是一样的道理。

13. 尽量减少对变量的重复计算

如:

for(int i=0;i<list.size();i++) 
 
应该改为: 
 
for(int i=0,len=list.size();i<len;i++) 

并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。

14. 尽量避免不必要的创建

如:

A a = new A(); 
 
if(i==1){ 
 
list.add(a); 
 
} 
 
应该改为: 
 
if(i==1){ 
 
A a = new A(); 
 
list.add(a); 
 
} 

15. 尽量在finally块中释放资源

程序中使用到的资源应当被释放,以避免资源泄漏,这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。

16. 尽量使用移位来代替'a/b'的操作

"/"是一个代价很高的操作,使用移位的操作将会更快和更有效

如:

int num = a / 4; 
 
int num = a / 8; 
 
应该改为: 
 
int num = a >> 2; 
 
int num = a >> 3; 

但注意的是使用移位应添加注释,因为移位操作不直观,比较难理解。

17.尽量使用移位来代替'a*b'的操作

同样的,对于'*'操作,使用移位的操作将会更快和更有效

如:

int num = a * 4; 
 
int num = a * 8; 
 
应该改为: 
 
int num = a << 2; 
 
int num = a << 3; 

18. 尽量确定StringBuffer的容量

StringBuffer 的构造器会创建一个默认大小(通常是16)的字符数组。在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。在大多数情况下,你可以在创建 StringBuffer的时候指定大小,这样就避免了在容量不够的时候自动增长,以提高性能。

如:

StringBuffer buffer = new StringBuffer(1000); 

19. 尽量早释放无用对象的引用

大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。

例如:

Java代码 
 
Public void test(){ 
 
Object obj = new Object(); 
 
…… 
 
Obj=null; 
 
} 

上面这个就没必要了,随着方法test()的执行完成,程序中obj引用变量的作用域就结束了。但是如果是改成下面:

Java代码

Public void test(){ 
 
Object obj = new Object(); 
 
…… 
 
Obj=null; 
 
//执行耗时,耗内存操作;或调用耗时,耗内存的方法 
 
…… 
 
} 

这时候就有必要将obj赋值为null,可以尽早的释放对Object对象的引用。

20. 尽量避免使用二维数组

二维数据占用的内存空间比一维数组多得多,大概10倍以上。

21. 尽量避免使用split

除非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char),频繁split的可以缓存结果。

22. ArrayList & LinkedList

一个是线性表,一个是链表,一句话,随机查询尽量使用ArrayList,ArrayList优于LinkedList,LinkedList还要移动指针,添加删除的操作LinkedList优于ArrayList,ArrayList还要移动数据,不过这是理论性分析,事实未必如此,重要的是理解好2者得数据结构,对症下药。

23. 尽量使用System.arraycopy ()代替通过来循环复制数组

System.arraycopy() 要比通过循环来复制数组快的多。

24. 尽量缓存经常使用的对象

尽可能将经常使用的对象进行缓存,可以使用数组,或HashMap的容器来进行缓存,但这种方式可能导致系统占用过多的缓存,性能下降,推荐可以使用一些第三方的开源工具,如EhCache,Oscache进行缓存,他们基本都实现了FIFO/FLU等缓存算法。

25. 尽量避免非常大的内存分配

有时候问题不是由当时的堆状态造成的,而是因为分配失败造成的。分配的内存块都必须是连续的,而随着堆越来越满,找到较大的连续块越来越困难。

26. 慎用异常

当创建一个异常时,需要收集一个栈跟踪(stack track),这个栈跟踪用于描述异常是在何处创建的。构建这些栈跟踪时需要为运行时栈做一份快照,正是这一部分开销很大。当需要创建一个 Exception 时,JVM 不得不说:先别动,我想就您现在的样子存一份快照,所以暂时停止入栈和出栈操作。栈跟踪不只包含运行时栈中的一两个元素,而是包含这个栈中的每一个元素。

如果您创建一个 Exception ,就得付出代价,好在捕获异常开销不大,因此可以使用 try-catch 将核心内容包起来。从技术上讲,你甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。真正要花代价的是创建异常,幸运的是,好的编程习惯已教会我们,不应该不管三七二十一就抛出异常。异常是为异常的情况而设计的,使用时也应该牢记这一原则。

27. 尽量重用对象

特别是String对象的使用中,出现字符串连接情况时应使用StringBuffer代替,由于系统不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理。因此生成过多的对象将会给程序的性能带来很大的影响。

28. 不要重复初始化变量

默认情况下,调用类的构造函数时,java会把变量初始化成确定的值,所有的对象被设置成null,整数变量设置成0,float和double变量设置成0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键字创建一个对象时,构造函数链中的所有构造函数都会被自动调用。

这里有个注意,给成员变量设置初始值但需要调用其他方法的时候,最好放在一个方法。比如initXXX()中,因为直接调用某方法赋值可能会因为类尚未初始化而抛空指针异常,如:public int state = this.getState()。

29. 在java+Oracle的应用系统开发中,java中内嵌的SQL语言应尽量使用大写形式,以减少Oracle解析器的解析负担。

30. 在java编程过程中,进行数据库连接,I/O流操作,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销。

31. 过分的创建对象会消耗系统的大量内存,严重时,会导致内存泄漏,因此,保证过期的对象的及时回收具有重要意义。JVM的GC并非十分智能,因此建议在对象使用完毕后,手动设置成null。

32. 在使用同步机制时,应尽量使用方法同步代替代码块同步。

33. 不要在循环中使用Try/Catch语句,应把Try/Catch放在循环最外层

Error是获取系统错误的类,或者说是虚拟机错误的类。不是所有的错误Exception都能获取到的,虚拟机报错Exception就获取不到,必须用Error获取。

34. 通过StringBuffer的构造函数来设定它的初始化容量,可以明显提升性能

StringBuffer的默认容量为16,当StringBuffer的容量达到最大容量时,它会将自身容量增加到当前的2倍+2,也就是2*n+2。无论何时,只要StringBuffer到达它的最大容量,它就不得不创建一个新的对象数组,然后复制旧的对象数组,这会浪费很多时间。所以给StringBuffer设置一个合理的初始化容量值,是很有必要的!

35. 合理使用java.util.Vector

Vector与StringBuffer类似,每次扩展容量时,所有现有元素都要赋值到新的存储空间中。Vector的默认存储能力为10个元素,扩容加倍。

vector.add(index,obj) 这个方法可以将元素obj插入到index位置,但index以及之后的元素依次都要向下移动一个位置(将其索引加 1)。 除非必要,否则对性能不利。同样规则适用于remove(int index)方法,移除此向量中指定位置的元素。将所有后续元素左移(将其索引减 1)。返回此向量中移除的元素。所以删除vector最后一个元素要比删除第1个元素开销低很多。删除所有元素最好用removeAllElements()方法。

如果要删除vector里的一个元素可以使用 vector.remove(obj);而不必自己检索元素位置,再删除,如int index = indexOf(obj);vector.remove(index)。

38. 不用new关键字创建对象的实例

用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。

下面是Factory模式的一个典型实现:

public static Credit getNewCredit() 
 
{ 
 
return new Credit(); 
 
} 
 
改进后的代码使用clone()方法: 
 
private static Credit BaseCredit = new Credit(); 
 
public static Credit getNewCredit() 
 
{ 
 
return (Credit)BaseCredit.clone(); 
 
} 

39. 不要将数组声明为:public static final

40. HaspMap的遍历:

Map<String, String[]> paraMap = new HashMap<String, String[]>(); 
 
for( Entry<String, String[]> entry : paraMap.entrySet() ) 
 
{ 
 
String appFieldDefId = entry.getKey(); 
 
String[] values = entry.getValue(); 
 
} 

利用散列值取出相应的Entry做比较得到结果,取得entry的值之后直接取key和value。

41. array(数组)和ArrayList的使用

array 数组效率最高,但容量固定,无法动态改变,ArrayList容量可以动态增长,但牺牲了效率。

42. 单线程应尽量使用 HashMap, ArrayList,除非必要,否则不推荐使用HashTable,Vector,它们使用了同步机制,而降低了性能。

43. StringBuffer,StringBuilder的区别在于:java.lang.StringBuffer 线程安全的可变字符序列。一个类似于String的字符串缓冲区,但不能修改。StringBuilder与该类相比,通常应该优先使用StringBuilder类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。为了获得更好的性能,在构造StringBuffer或StringBuilder时应尽量指定她的容量。当然如果不超过16个字符时就不用了。 相同情况下,使用StringBuilder比使用StringBuffer仅能获得10%~15%的性能提升,但却要冒多线程不安全的风险。综合考虑还是建议使用StringBuffer。

44. 尽量使用基本数据类型代替对象。

45. 使用具体类比使用接口效率高,但结构弹性降低了,但现代IDE都可以解决这个问题。

46. 考虑使用静态方法,如果你没有必要去访问对象的外部,那么就使你的方法成为静态方法。它会被更快地调用,因为它不需要一个虚拟函数导向表。这同时也是一个很好的实践,因为它告诉你如何区分方法的性质,调用这个方法不会改变对象的状态。

47. 应尽可能避免使用内在的GET,SET方法。

48.避免枚举,浮点数的使用。

以下举几个实用优化的例子:

一、避免在循环条件中使用复杂表达式

在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。例子:

import java.util.Vector; 
 
class CEL { 
 
void method (Vector vector) { 
 
for (int i = 0; i < vector.size (); i++) // Violation 
 
; // ... 
 
} 
 
} 
 
更正: 
 
class CEL_fixed { 
 
void method (Vector vector) { 
 
int size = vector.size () 
 
for (int i = 0; i < size; i++) 
 
; // ... 
 
} 
 
} 

二、为'Vectors' 和 'Hashtables'定义初始大小

JVM为Vector扩充大小的时候需要重新创建一个更大的数组,将原原先数组中的内容复制过来,最后,原先的数组再被回收。可见Vector容量的扩大是一个颇费时间的事。

通常,默认的10个元素大小是不够的。你最好能准确的估计你所需要的最佳大小。例子:

import java.util.Vector;  
  
public class DIC {  
  
public void addObjects (Object[] o) {  
  
// if length > 10, Vector needs to expand  
  
for (int i = 0; i< o.length;i++) {  
  
v.add(o); // capacity before it can add more elements.  
  
}  
  
}  
  
public Vector v = new Vector(); // no initialCapacity.  
  
}  
更正: 
 
自己设定初始大小。 
 
public Vector v = new Vector(20); 
 
public Hashtable hash = new Hashtable(10); 

三、在finally块中关闭Stream

程序中使用到的资源应当被释放,以避免资源泄漏。这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。

四、使用'System.arraycopy ()'代替通过来循环复制数组

例子:

public class IRB 
 
{ 
 
void method () { 
 
int[] array1 = new int [100]; 
 
for (int i = 0; i < array1.length; i++) { 
 
array1 [i] = i; 
 
} 
 
int[] array2 = new int [100]; 
 
for (int i = 0; i < array2.length; i++) { 
 
array2 [i] = array1 [i]; // Violation 
 
} 
 
} 
 
} 
 
更正: 
 
public class IRB 
 
{ 
 
void method () { 
 
int[] array1 = new int [100]; 
 
for (int i = 0; i < array1.length; i++) { 
 
array1 [i] = i; 
 
} 
 
int[] array2 = new int [100]; 
 
System.arraycopy(array1, 0, array2, 0, 100); 
 
} 
 
} 

五、让访问实例内变量的getter/setter方法变成”final”

简单的getter/setter方法应该被置成final,这会告诉编译器,这个方法不会被重载,所以,可以变成”inlined”,例子:

class MAF { 
 
public void setSize (int size) { 
 
_size = size; 
 
} 
 
private int _size; 
 
} 
 
更正: 
 
class DAF_fixed { 
 
final public void setSize (int size) { 
 
_size = size; 
 
} 
 
private int _size; 
 
} 

六、对于常量字符串,用'String' 代替 'StringBuffer'

常量字符串并不需要动态改变长度。

例子:

public class USC { 
 
String method () { 
 
StringBuffer s = new StringBuffer ("Hello"); 
 
String t = s + "World!"; 
 
return t; 
 
} 
 
} 
更正:把StringBuffer换成String,如果确定这个String不会再变的话,这将会减少运行开销提高性能。

七、在字符串相加的时候,使用 ' ' 代替 " ",如果该字符串只有一个字符的话

例子:

public class STR { 
 
public void method(String s) { 
 
String string = s + "d" // violation. 
 
string = "abc" + "d" // violation. 
 
} 
 
} 
 
更正: 
 
将一个字符的字符串替换成' ' 
 
public class STR { 
 
public void method(String s) { 
 
String string = s + 'd' 
 
string = "abc" + 'd' 
 
} 
 
} 

以上仅是Java方面编程时的性能优化,性能优化大部分都是在时间、效率、代码结构层次等方面的权衡,各有利弊,不要把上面内容当成教条,或许有些对我们实际工作适用,有些不适用,还望根据实际工作场景进行取舍,活学活用,变通为宜。

 

https://maimai.cn/article/detail?fid=738625582

Dubbo 是支持泛化调用的,什么是泛化调用呢,泛化调用的好处是什么呢,泛化调用说白一点就是服务消费者并没有服务的接口,学了前面几章的内容之后,你肯定会发现,在我们开发写Demo的时候,必做的一件事情,就是在服务消费者和服务提供者两端同路径下有同样的接口,只不过在服务提供者端会有该接口的具体实现,之所以在服务消费者有一个没有任何具体实现的接口,是因为在设计RPC之初,设计者的最高理念就是你去面向接口编程,你在进行远程调用的时候,并没有意识到你在进行远程调用,却也能拿到接口一样,相信你也感觉到了,服务消费者在调用服务的时候,与调用一个普通的接口是一样的。

  泛化调用就是服务消费者端因为某种原因并没有该服务接口,这个原因有很多,比如是跨语言的,一个PHP工程师想调用某个java接口,他并不能按照你约定,去写一个个的接口,Dubbo并不是跨语言的RPC框架,但并不是不能解决这个问题,这个PHP程序员搭建了一个简单的java web项目,引入了dubbo的jar包,使用dubbo的泛化调用,然后利用web返回json,这样也能完成跨语言的调用。泛化调用的好处之一就是这个了

  好了,简而言之,泛化调用,最最直接的表现就是服务消费者不需要有任何接口的实现,就能完成服务的调用。

3.5.1 泛化调用入门

老规矩,我们现在服务提供者端定义一个简单的接口,(与往常不一样的地方就是不需要把该接口复制到服务提供者的同路径下了,因为服务消费者不需要使用该接口进行调用),好了,定义一个简单的接口EasyCommonService.java

package org.bazinga.service;
 
public interface EasyCommonService {
    
    public String helloService(String name);
 
}

该接口的具体实现EasyCommonServiceImpl.java

package org.bazinga.service.impl;
 
import org.bazinga.service.EasyCommonService;
 
public class EasyCommonServiceImpl implements EasyCommonService {
 
    public String helloService(String name) {
        System.out.println("name is "+ name);
        return "hello " + name;
    }
 
}

 

服务提供者端的Spring的配置文件spring-dubbo-provider-generic.xml

<?xml version="1.1" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
       http://www.springframework.org/schema/beans/spring-beans.xsd  
       http://code.alibabatech.com/schema/dubbo  
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
       
    <dubbo:application owner="lyncc" name="bazinga-app" />
    <!--zookeeper注册中心 -->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/> 
    
    <dubbo:protocol name ="dubbo" port="20880" />
    
    <bean id="easyCommonService" class="org.bazinga.service.impl.EasyCommonServiceImpl" />
  <dubbo:service  interface="org.bazinga.service.EasyCommonService" ref="easyCommonService" />
    
</beans>

服务提供者端再写一个启动类DubboxProviderGenericService.java:

package org.bazinga.service.test;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class DubboxProviderGenericService {
    
    public static void main(String[] args) throws InterruptedException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "spring-dubbo-provider-generic.xml");
        context.start();
        Thread.sleep(2000000l);
    }
 
}

好了,到此为止,泛化调用服务提供者的配置文件就全部结束了,你可以看到从代码和spring的配置文件都没有任何特殊处理,与一般的服务提供者并没有任何的不同,泛化调用,从这四个字看也知道是调用的方式不一样而已,我们再看看服务消费者端的代码编写

  因为服务消费者没有了接口,我们直接编写消费者端spring的配置文件spring-dubbo-consumer-generic.xml

<?xml version="1.1" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
       http://www.springframework.org/schema/beans/spring-beans.xsd  
       http://code.alibabatech.com/schema/dubbo  
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
       
    <dubbo:application owner="lyncc" name="bazinga-consumer" />
    <!--zookeeper注册中心 -->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/> 
    
    <dubbo:reference id="easyCommonService" interface="org.bazinga.service.EasyCommonService" generic="true"/> 
    
</beans>

 

可以看到上图的配置文件中有两个地方需要注意一下,第一个是interface,其实该接口在消费者端并不存在,这是与往常写的不一样的地方,第二个地方需要注意的地方就是generic=”true”这样的标签,表示该接口支持泛型调用。

好了,我们写一个服务测试类,看看如何进行泛型调用DubboConsumerGenericService.java

package org.bazinga.service.test;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import com.alibaba.dubbo.rpc.service.GenericService;
 
public class DubboConsumerGenericService {
    
    
    public static void main(String[] args) {
        
        
        /////////////////Spring泛化调用/////////
      ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
              "spring-dubbo-consumer-generic.xml");
      context.start();
      
      GenericService easyCommonService = (GenericService) context.getBean("easyCommonService");
      Object result = easyCommonService.$invoke("helloService", new String[] { "java.lang.String" }, new Object[] { "hello" });
      System.out.println(result);
      
        
    }
 
}

看到Main函数中,从spring的上下文中读到”easyCommonService”之后却把它强转为GenericService的类,然后调用GenericService的$invoke的方法,该方法有三个参数,第一个参数是你调用远程接口的具体方法名,第二个参数是helloService这个方法的入参的类型,最后一个参数是值。

我们测试一下,启动DubboxProviderGenericService的main函数,然后启动服务消费者的测试类DubboConsumerGenericService.java,你会发现控制台打印:

可以看到能够调通,没有问题。

我们刚才说,一个PHP程序员想要搭建一个简单的web项目,可是你却叫他依赖于spring的配置文件,对他难度是不小的,dubbo也帮你想到了,泛型调用,服务消费端可以不依赖spring的配置文件,我们重新写下测试类DubboConsumerGenericService:

package org.bazinga.service.test;
 
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.utils.ReferenceConfigCache;
import com.alibaba.dubbo.rpc.service.GenericService;
 
public class DubboConsumerGenericService {
 
    public static void main(String[] args) {
 
        // 普通编码配置方式
        ApplicationConfig application = new ApplicationConfig();
        application.setName("bazinga-consumer");
 
        // 连接注册中心配置
        RegistryConfig registry = new RegistryConfig();
        registry.setAddress("zookeeper://127.0.0.1:2181");
 
        ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
        reference.setApplication(application);
        reference.setRegistry(registry);
        reference.setInterface("org.bazinga.service.EasyCommonService");
        reference.setGeneric(true); // 声明为泛化接口
 
        ReferenceConfigCache cache = ReferenceConfigCache.getCache();
        GenericService genericService = cache.get(reference);
 
        // 基本类型以及Date,List,Map等不需要转换,直接调用
        Object result = genericService.$invoke("helloService", new String[] { "java.lang.String" },
                new Object[] { "world" });
        System.out.println(result);
 
    }
 
}

 

重新启动一下该类。控制台正常打印:

也能正常进行调用。

3.5.2 泛化调用小结

  泛化调用可以方便用户对dubbo服务消费者端的扩展,可以方便,丰富了服务消费者的调用方式,甚至可以做变相的Rest调用,这些都是可以的,不过,它的缺点也是很明显的,参数传递复杂,不方便使用。但是这种方式是不能缺失的。

原文https://blog.csdn.net/linuu/article/details/54313560

Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。

在这篇由三部分组成的 

Spring 系列

 的第 1 部分中,我将介绍 Spring 框架。我先从框架底层模型的角度描述该框架的功能,然后将讨论两个最有趣的模块:Spring 面向方面编程(AOP)和控制反转 (IOC) 容器。接着将使用几个示例演示 IOC 容器在典型应用程序用例场景中的应用情况。这些示例还将成为本系列后面部分进行的展开式讨论的基础,在本文的后面部分,将介绍 Spring 框架通过 Spring AOP 实现 AOP 构造的方式。

请参阅 下载,下载 Spring 框架和 Apache Ant,运行本系列的示例应用程序需要它们。

Spring 框架

Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图 1 所示。

图 1. Spring 框架的 7 个模块

组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

  • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
  • Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
  • Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
  • Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
  • Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
  • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
  • Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。

IOC 和 AOP

控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。

在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。下表列出了 IOC 的一个实现模式。

Spring 框架的 IOC 容器采用类型 2 和类型3 实现。

面向方面的编程

面向方面的编程

,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是

方面

,它将那些影响多个类的行为封装到可重用的模块中。

AOP 和 IOC 是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务

模块化

,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是 Java 类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用 Spring AOP 编写的应用程序代码是松散耦合的。

AOP 的功能完全集成到了 Spring 事务管理、日志和其他各种特性的上下文中。

IOC 容器

Spring 设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean 组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。

BeanFactory 支持两个对象模型。

  • 单态 模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton 是默认的也是最常用的对象模型。对于无状态服务对象很理想。
  • 原型 模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。

bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。正如我将在下一个示例中演示的那样,Spring 框架使用 JavaBean 属性和配置数据来指出必须设置的依赖关系。

BeanFactory 接口

因为 org.springframework.beans.factory.BeanFactory 是一个简单接口,所以可以针对各种底层存储方法实现。最常用的 BeanFactory 定义是 XmlBeanFactory,它根据 XML 文件中的定义装入 bean,如清单 1 所示。

清单 1. XmlBeanFactory
1
BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml"));

在 XML 文件中定义的 Bean 是被消极加载的,这意味在需要 bean 之前,bean 本身不会被初始化。要从 BeanFactory 检索 bean,只需调用 getBean() 方法,传入将要检索的 bean 的名称即可,如清单 2 所示。

清单 2. getBean()
1
MyBean mybean = (MyBean) factory.getBean("mybean");

每个 bean 的定义都可以是 POJO (用类名和 JavaBean 初始化属性定义) 或 FactoryBeanFactoryBean 接口为使用 Spring 框架构建的应用程序添加了一个间接的级别。

IOC 示例

理解控制反转最简单的方式就是看它的实际应用。在对由三部分组成的 

Spring 系列

 的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC 容器注入应用程序的依赖关系(而不是将它们构建进来)。

我用开启在线信用帐户的用例作为起点。对于该实现,开启信用帐户要求用户与以下服务进行交互:

  • 信用级别评定服务,查询用户的信用历史信息。
  • 远程信息链接服务,插入客户信息,将客户信息与信用卡和银行信息连接起来,以进行自动借记(如果需要的话)。
  • 电子邮件服务,向用户发送有关信用卡状态的电子邮件。

三个接口

对于这个示例,我假设服务已经存在,理想的情况是用松散耦合的方式把它们集成在一起。以下清单显示了三个服务的应用程序接口。

清单 3. CreditRatingInterface
1

2

3
public interface CreditRatingInterface {
   public boolean getUserCreditHistoryInformation(ICustomer iCustomer);
}

清单 3 所示的信用级别评定接口提供了信用历史信息。它需要一个包含客户信息的 Customer 对象。该接口的实现是由 CreditRating 类提供的。

清单 4. CreditLinkingInterface
1

2

3

4

5
public interface CreditLinkingInterface {
public String getUrl();
        public void setUrl(String url);
        public void linkCreditBankAccount() throws Exception ;
}

信用链接接口将信用历史信息与银行信息(如果需要的话)连接在一起,并插入用户的信用卡信息。信用链接接口是一个远程服务,它的查询是通过 getUrl() 方法进行的。URL 由 Spring 框架的 bean 配置机制设置,我稍后会讨论它。该接口的实现是由 CreditLinking 类提供的。

清单 5. EmailInterface
1

2

3

4

5

6

7

8

9

10

11
public interface EmailInterface {
      public void sendEmail(ICustomer iCustomer);
      public String getFromEmail();
      public void setFromEmail(String fromEmail) ;
      public String getPassword();
      public void setPassword(String password) ;
      public String getSmtpHost() ;
      public void setSmtpHost(String smtpHost);
      public String getUserId() ;
      public void setUserId(String userId);
   }

EmailInterface 负责向客户发送关于客户信用卡状态的电子邮件。邮件配置参数(例如 SMPT 主机、用户名、口令)由前面提到的 bean 配置机制设置。Email 类提供了该接口的实现。

Spring 使其保持松散

这些接口就位之后,接下来要考虑的就是如何用松散耦合方式将它们集成在一起。在 清单 6 中可以看到信用卡帐户用例的实现。

注意,所有的 setter 方法都是由 Spring 的配置 bean 实现的。所有的依赖关系 (也就是三个接口)都可以由 Spring 框架用这些 bean 注入。createCreditCardAccount() 方法会用服务去执行其余实现。在 清单 7 中可以看到 Spring 的配置文件。我用箭头突出了这些定义。

运行应用程序

要运行示例应用程序,首先必须 下载 Spring 框架 及其所有依赖文件。接下来,将框架释放到(比如说)磁盘 

c:\

,这会创建 

C:\spring-framework-1.2-rc2

 (适用于当前发行版本) 这样的文件夹。在继续后面的操作之前,还必须下载和释放 Apache Ant

接下来,将源代码释放到文件夹,例如 

c:\

 盘,然后创建 

SpringProject

。将 Spring 库(即 

C:\spring-framework-1.2-rc2\dist

下的 

spring.jar

 和 

C:\spring-framework-1.2-rc2\lib\jakarta-commons

 下的 

commons-logging.jar

)复制到 

SpringProject\lib

 文件夹中。完成这些工作之后,就有了必需的构建依赖关系集。

打开命令提示符,将当前目录切换到 

SpringProject

,在命令提示符中输入以下命令:build

这会构建并运行 CreateCreditAccountClient 类,类的运行将创建 Customer 类对象并填充它,还会调用 CreateCreditCardAccount 类创建并链接信用卡帐户。CreateCreditAccountClient 还会通过 ClassPathXmlApplicationContext 装入 Spring 配置文件。装入 bean 之后,就可以通过 getBean() 方法访问它们了,如清单 8 所示。

清单 8. 装入 Spring 配置文件
1

2

3

4

5

6

7
ClassPathXmlApplicationContext appContext =
                    new ClassPathXmlApplicationContext(new String[] {
     "springexample-creditaccount.xml"
    });
CreateCreditCardAccountInterface creditCardAccount =
                    (CreateCreditCardAccountInterface)
    appContext.getBean("createCreditCard");

 

1几个最重要的快捷键

代码助手:Ctrl+Space(简体中文操作系统是Alt+/)
快速修正:Ctrl+1
单词补全:Alt+/
打开外部Java文档:Shift+F2

显示搜索对话框:Ctrl+H
快速Outline:Ctrl+O
打开资源:Ctrl+Shift+R
打开类型:Ctrl+Shift+T
显示重构菜单:Alt+Shift+T

上一个/下一个光标的位置:Alt+Left/Right
上一个/下一个成员(成员对象或成员函数):Ctrl+Shift+Up/Down
选中闭合元素:Alt+Shift+Up/Down/Left/Right
删除行:Ctrl+D
在当前行上插入一行:Ctrl+Shift+Enter
在当前行下插入一行: Shift+Enter
上下移动选中的行:Alt+Up/Down

组织导入:Ctrl+Shift+O

2 定位
2.1行内定位
行末/行首:End/Home
前一个/后一个单词:Ctrl+Right/Left
2.2文件内定位
跳到某行:Ctrl+L
上下滚屏:Ctrl+Up/Down
上一个/下一个成员(成员对象或成员函数):Ctrl+Shift+Up/Down
快速Outline:Ctrl+O
2.3跨文件定位
打开声明:F3
打开资源:Ctrl+Shift+R
打开类型:Ctrl+Shift+T
在workspace中搜索选中元素的声明:Ctrl+G
在workspace中搜索选中的文本:Ctrl+Alt+G
在workspace中搜索选中元素的引用:Ctrl+Shift+G
打开调用层次结构:Ctrl+Alt+H
快速层次结构:Ctrl+T
反悔:Ctrl+Z
2.4其它
上一个/下一个光标所在位置:Alt+Left/Right
上一个编辑的位置:Ctrl+Q

 

3 选中
3.1行内选中
选中到行末/行首:Shift+End/Home
选中上一个/下一个单词:Ctrl+Shift+Left/Right
3.2文件内选中
选中闭合元素:Alt+Shift+Up
恢复到上一个选中:Alt+Shift+Down
选中下一个/上一个元素:Alt+Shift+Right/Left

 

4 定位/选中/操作同时
删除行:Ctrl+D
删除下一个/上一个单词:Ctrl+Delete/Backspace
删除到行末:Ctrl+Shift+Delete
在当前行上插入一行:Ctrl+Shift+Enter
在当前行下插入一行: Shift+Enter
上下移动选中的行:Alt+Up/Down
拷贝选中的行:Ctrl+Alt+Up/Down

 

5其它的代码编辑类快捷键
保存:Ctrl+S
保存所有:Ctrl+Shift+S
下一个命中的项(搜索之后):Ctrl+.
注释:Ctrl+/
添加导入:Ctrl+Shift+M
显示快捷键帮助:Ctrl+Shift+L
变为大/小写:Ctrl+Shift+X/Y

 

6 重构
显示重构菜单:Alt+Shift+T
重构-改变方法签名:Alt+Shift+C
重构-移动:Alt+Shift+V
重构-重命名:Alt+Shift+R

 

7 编辑器、视图、透视图切换
下一个编辑器:Ctrl+F6
下一个视图:Ctrl+F7
下一个透视图:Ctrl+F8
最大化当前视图或编辑器:Ctrl+M
激活编辑器:F12

 

8 Debug
F5:Step Into(debug)
F6:Step over(debug)
F7:Step return(debug)
F8:Resume(debug)
F11:debug上一个应用(debug)

 

9 Up/Down/Right/Left类快捷键
Ctrl
前一个/后一个单词:Ctrl+Right/Left
上下滚屏:Ctrl+Up/Down
Alt
上一个/下一个光标的位置:Alt+Left/Right
上下移动选中的行:Alt+Up/Down
Shift
选中上一个/下一个字符:Shift+Left/Right
选中上一行/下一行(从当前光标位置开始):Shift+Up/Down
Ctrl+Shift
上一个/下一个成员(成员对象或成员函数):Ctrl+Shift+Up/Down
选中上一个/下一个单词:Ctrl+Shift+Left/Right
Alt+Shift
选中闭合元素:Alt+Shift+Up
恢复到上一个选中:Alt+Shift+Down
选中下一个/上一个元素:Alt+Shift+Right/Left
拷贝选中的行:Ctrl+Alt+Up/Down
Ctrl+Alt
拷贝选中的行:Ctrl+Alt+Up/Down

 

10 F类快捷键
F2:显示提示/重命名
F3:打开选中元素的声明
F4:打开选中元素的类型继承结构
F5:刷新
F5:Step Into(debug)
F6:Step over(debug)
F7:Step return(debug)
F8:Resume(debug)
F11:debug上一个应用(debug)
F12:激活编辑器

 

出处:http://www.cnblogs.com/ifaithu/archive/2013/02/19/2917263.html

================================================================================

Eclipse快捷键大全

Ctrl+1 快速修复(最经典的快捷键,就不用多说了)
Ctrl+D: 删除当前行
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交互位置(同上)
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)
Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性
Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)
Shift+Ctrl+Enter 在当前行插入空行(原理同上条)
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)
Ctrl+/ 注释当前行,再按则取消注释
Ctrl+O 快速显示 OutLine
Ctrl+T 快速显示当前类的继承结构
Ctrl+W 关闭当前Editer
Ctrl+K 参照选中的Word快速定位到下一个
Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)
Ctrl+/(小键盘) 折叠当前类中的所有代码
Ctrl+×(小键盘) 展开当前类中的所有代码
Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)
Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)
Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)
Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)
Ctrl+Shift+F4 关闭所有打开的Editer
Ctrl+Shift+X 把当前选中的文本全部变味小写
Ctrl+Shift+Y 把当前选中的文本全部变为小写
Ctrl+Shift+F 格式化当前代码
Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)

下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开头的了)
Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)
Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)
Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)
Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)
Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能)
Alt+Shift+I 合并变量(可能这样说有点不妥Inline)
Alt+Shift+V 移动函数和变量(不怎么常用)
Alt+Shift+Z 重构的后悔药(Undo)

编辑
作用域 功能 快捷键
全局 查找并替换 Ctrl+F
文本编辑器 查找上一个 Ctrl+Shift+K
文本编辑器 查找下一个 Ctrl+K
全局 撤销 Ctrl+Z
全局 复制 Ctrl+C
全局 恢复上一个选择 Alt+Shift+↓
全局 剪切 Ctrl+X
全局 快速修正 Ctrl1+1
全局 内容辅助 Alt+/
全局 全部选中 Ctrl+A
全局 删除 Delete
全局 上下文信息 Alt+?
Alt+Shift+?
Ctrl+Shift+Space
Java编辑器 显示工具提示描述 F2
Java编辑器 选择封装元素 Alt+Shift+↑
Java编辑器 选择上一个元素 Alt+Shift+←
Java编辑器 选择下一个元素 Alt+Shift+→
文本编辑器 增量查找 Ctrl+J
文本编辑器 增量逆向查找 Ctrl+Shift+J
全局 粘贴 Ctrl+V
全局 重做 Ctrl+Y


查看
作用域 功能 快捷键
全局 放大 Ctrl+=
全局 缩小 Ctrl+-


窗口
作用域 功能 快捷键
全局 激活编辑器 F12
全局 切换编辑器 Ctrl+Shift+W
全局 上一个编辑器 Ctrl+Shift+F6
全局 上一个视图 Ctrl+Shift+F7
全局 上一个透视图 Ctrl+Shift+F8
全局 下一个编辑器 Ctrl+F6
全局 下一个视图 Ctrl+F7
全局 下一个透视图 Ctrl+F8
文本编辑器 显示标尺上下文菜单 Ctrl+W
全局 显示视图菜单 Ctrl+F10
全局 显示系统菜单 Alt+-


导航
作用域 功能 快捷键
Java编辑器 打开结构 Ctrl+F3
全局 打开类型 Ctrl+Shift+T
全局 打开类型层次结构 F4
全局 打开声明 F3
全局 打开外部javadoc Shift+F2
全局 打开资源 Ctrl+Shift+R
全局 后退历史记录 Alt+←
全局 前进历史记录 Alt+→
全局 上一个 Ctrl+,
全局 下一个 Ctrl+.
Java编辑器 显示大纲 Ctrl+O
全局 在层次结构中打开类型 Ctrl+Shift+H
全局 转至匹配的括号 Ctrl+Shift+P
全局 转至上一个编辑位置 Ctrl+Q
Java编辑器 转至上一个成员 Ctrl+Shift+↑
Java编辑器 转至下一个成员 Ctrl+Shift+↓
文本编辑器 转至行 Ctrl+L


搜索
作用域 功能 快捷键
全局 出现在文件中 Ctrl+Shift+U
全局 打开搜索对话框 Ctrl+H
全局 工作区中的声明 Ctrl+G
全局 工作区中的引用 Ctrl+Shift+G


文本编辑
作用域 功能 快捷键
文本编辑器 改写切换 Insert
文本编辑器 上滚行 Ctrl+↑
文本编辑器 下滚行 Ctrl+↓


文件
作用域 功能 快捷键
全局 保存 Ctrl+X
Ctrl+S
全局 打印 Ctrl+P
全局 关闭 Ctrl+F4
全局 全部保存 Ctrl+Shift+S
全局 全部关闭 Ctrl+Shift+F4
全局 属性 Alt+Enter
全局 新建 Ctrl+N


项目
作用域 功能 快捷键
全局 全部构建 Ctrl+B


源代码
作用域 功能 快捷键
Java编辑器 格式化 Ctrl+Shift+F
Java编辑器 取消注释 Ctrl+\
Java编辑器 注释 Ctrl+/
Java编辑器 添加导入 Ctrl+Shift+M
Java编辑器 组织导入 Ctrl+Shift+O
Java编辑器 使用try/catch块来包围 未设置,太常用了,所以在这里列出,建议自己设置。
也可以使用Ctrl+1自动修正。


运行
作用域 功能 快捷键
全局 单步返回 F7
全局 单步跳过 F6
全局 单步跳入 F5
全局 单步跳入选择 Ctrl+F5
全局 调试上次启动 F11
全局 继续 F8
全局 使用过滤器单步执行 Shift+F5
全局 添加/去除断点 Ctrl+Shift+B
全局 显示 Ctrl+D
全局 运行上次启动 Ctrl+F11
全局 运行至行 Ctrl+R
全局 执行 Ctrl+U


重构
作用域 功能 快捷键
全局 撤销重构 Alt+Shift+Z
全局 抽取方法 Alt+Shift+M
全局 抽取局部变量 Alt+Shift+L
全局 内联 Alt+Shift+I
全局 移动 Alt+Shift+V
全局 重命名 Alt+Shift+R
全局 重做 Alt+Shift+Y

 

出处:http://www.blogjava.net/action/articles/17339.html

================================================================================

eclipse快捷键以及使用技巧大全

1. 打开MyEclipse 6.0.1,然后“window”→“Preferences”
2. 选择“java”,展开,“Editor”,选择“Content Assist”。
3. 选择“Content Assist”,然后看到右边,右边的“Auto-Activation”下面的“AutoActivation triggers for java”这个选项。其实就是指触发代码提示的就是“.”这个符号。
4.“Auto Activation triggers for java”这个选项,在“.”后加abc字母,方便后面的查找修改。然后“apply”,点击“OK”。
5. 然后,“File”→“Export”,在弹出的窗口中选择“Perferences”,点击“下一步”。
6. 选择导出文件路径,本人导出到桌面,输入“test”作为文件名,点击“保存”。
7. 在桌面找到刚在保存的文件“test.epf”,右键选择“用记事本打开”。
8. 可以看到很多配置MyEclipse 6.0.1的信息
9. 按“ctrl + F”快捷键,输入“.abc”,点击“查找下一个”。
10. 查找到“.abc”的配置信息如下:
11. 把“.abc”改成“.abcdefghijklmnopqrstuvwxyz(,”,保存,关闭“test.epf”。
12. 回到MyEclipse 6.0.1界面,“File”→“Import”,在弹出的窗口中选择“Perferences”,点击“下一步”,选择刚在已经修改的“test.epf”文件,点击“打 开”,点击“Finish”。该步骤和上面的导出步骤类似。
13. 最后当然是进行代码测试了。随便新建一个工程,新建一个类。在代码输入switch,foreach等进行测试。你立即会发现,果然出了提示,而且无论是敲哪个字母都会有很多相关的提示了,很流畅,很方便。
总结:
“Auto Activation triggers for java”这个选项就是指触发代码提示的的选项,把“.”改成
“.abcdefghijklmnopqrstuvwxyz(,”的意思,就是指遇到26个字母和.,(这些符号就触发代码提示功能了。
顺便说一下,修改类名,接口名等以不同颜色高亮的,可以这样配置在“java”→“enditor”→“syntac”,右边展开“java”→“classes”,勾上“Enable”这个选项,选择自己喜欢的颜色即可。
当然还有其他相关的颜色配置。具体就不说啦。其实,在“Preferences”这个东西,有很多可以配置的东西,使得MyEclipse 优化的,具体的就要各个人根据自己个人喜好去配置了。

 

Eclipse 常用快捷键

Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率。Eclipse中有如下一些和编辑相关的快捷键。
1. 【ALT+/】
此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁,当记不全类、方法和属性的名字时,多体验一下【ALT+/】快捷键带来的好处吧。
2. 【Ctrl+O】
显示类中方法和属性的大纲,能快速定位类的方法和属性,在查找Bug时非常有用。
3. 【Ctrl+/】
快速添加注释,能为光标所在行或所选定行快速添加注释或取消注释,在调试的时候可能总会需要注释一些东西或取消注释,现在好了,不需要每行进行重复的注释。
4. 【Ctrl+D】
删除当前行,这也是笔者的最爱之一,不用为删除一行而按那么多次的删除键。
5. 【Ctrl+M】
窗口最大化和还原,用户在窗口中进行操作时,总会觉得当前窗口小(尤其在编写代码时),现在好了,试试【Ctrl+M】快捷键。
查看和定位快捷键
在程序中,迅速定位代码的位置,快速找到Bug的所在,是非常不容易的事,Eclipse提供了强大的查找功能,可以利用如下的快捷键帮助完成查找定位的工作。
1. 【Ctrl+K】、【Ctrl++Shift+K】
快速向下和向上查找选定的内容,从此不再需要用鼠标单击查找对话框了。
2. 【Ctrl+Shift+T】
查找工作空间(Workspace)构建路径中的可找到Java类文件,不要为找不到类而痛苦,而且可以使用“*”、“?”等通配符。
3. 【Ctrl+Shift+R】
和【Ctrl+Shift+T】对应,查找工作空间(Workspace)中的所有文件(包括Java文件),也可以使用通配符。
4. 【Ctrl+Shift+G】
查找类、方法和属性的引用。这是一个非常实用的快捷键,例如要修改引用某个方法的代码,可以通过【Ctrl+Shift+G】快捷键迅速定位所有引用此方法的位置。
5. 【Ctrl+Shift+O】
快速生成import,当从网上拷贝一段程序后,不知道如何import进所调用的类,试试【Ctrl+Shift+O】快捷键,一定会有惊喜。
6. 【Ctrl+Shift+F】
格式化代码,书写格式规范的代码是每一个程序员的必修之课,当看见某段代码极不顺眼时,选定后按【Ctrl+Shift+F】快捷键可以格式化这段代码,如果不选定代码则默认格式化当前文件(Java文件)。
7. 【ALT+Shift+W】
查找当前文件所在项目中的路径,可以快速定位浏览器视图的位置,如果想查找某个文件所在的包时,此快捷键非常有用(特别在比较大的项目中)。
8. 【Ctrl+L】
定位到当前编辑器的某一行,对非Java文件也有效。
9. 【Alt+←】、【Alt+→】
后退历史记录和前进历史记录,在跟踪代码时非常有用,用户可能查找了几个有关联的地方,但可能记不清楚了,可以通过这两个快捷键定位查找的顺序。
10. 【F3】
快速定位光标位置的某个类、方法和属性。
11. 【F4】
显示类的继承关系,并打开类继承视图。

调试快捷键

Eclipse中有如下一些和运行调试相关的快捷键。
1. 【Ctrl+Shift+B】:在当前行设置断点或取消设置的断点。
2. 【F11】:调试最后一次执行的程序。
3. 【Ctrl+F11】:运行最后一次执行的程序。
4. 【F5】:跟踪到方法中,当程序执行到某方法时,可以按【F5】键跟踪到方法中。
5. 【F6】:单步执行程序。
6. 【F7】:执行完方法,返回到调用此方法的后一条语句。
7. 【F8】:继续执行,到下一个断点或程序结束。

常用编辑器快捷键

通常文本编辑器都提供了一些和编辑相关的快捷键,在Eclipse中也可以通过这些快捷键进行文本编辑。
1. 【Ctrl+C】:复制。
2. 【Ctrl+X】:剪切。
3. 【Ctrl+V】:粘贴。
4. 【Ctrl+S】:保存文件。
5. 【Ctrl+Z】:撤销。
6. 【Ctrl+Y】:重复。
7. 【Ctrl+F】:查找。

其他快捷键

Eclipse中还有很多快捷键,无法一一列举,用户可以通过帮助文档找到它们的使用方式,另外还有几个常用的快捷键如下。
1. 【Ctrl+F6】:切换到下一个编辑器。
2. 【Ctrl+Shift+F6】:切换到上一个编辑器。
3. 【Ctrl+F7】:切换到下一个视图。
4. 【Ctrl+Shift+F7】:切换到上一个视图。
5. 【Ctrl+F8】:切换到下一个透视图。
6. 【Ctrl+Shift+F8】:切换到上一个透视图。

Eclipse中快捷键比较多,可以通过帮助文档找到所有快捷键的使用,但要掌握所有快捷键的使用是不可能的,也没有必要,如果花点时间熟悉本节列举的快捷键,必将会事半功倍
1. edit->content Assist - > add Alt+/ 代码关联
2. Window -> Next Editor -> add Ctrl+Tab 切换窗口
3. Run/Debug Toggle Line Breakpoint -> add Ctrl+` 在调试的时候 增删断点
4. Source-> Surround with try/catch Block -> Ctrl+Shift+v 增加try catch 框框
5. Source -> Generate Getters and Setters -> Ctrl+Shift+. 增加get set 方法
-----------有用的快捷键-----------
Alt+/ 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)
Ctrl+1:光标停在某变量上,按Ctrl+1键,可以提供快速重构方案。选中若干行,按Ctrl+1键可将此段代码放入for、while、if、do或try等代码块中。
双击左括号(小括号、中括号、大括号),将选择括号内的所有内容。
Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性
-----------Ctrl系列-----------
Ctrl+K:将光标停留在变量上,按Ctrl+K键可以查找到下一个同样的变量
Ctrl+Shift+K:和Ctrl+K查找的方向相反
Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)
Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)
Ctrl+/ 注释当前行,再按则取消注释
Ctrl+T 快速显示当前类的继承结构
Ctrl+Shift-T: 打开类型(Open type)。如果你不是有意磨洋工,还是忘记通过源码树(source tree)打开的方式吧。
Ctrl+O:在代码中打开类似大纲视图的小窗口
Ctrl+鼠标停留:可以显示类和方法的源码
Ctrl+H:打开搜索窗口
Ctrl+/(小键盘) 折叠当前类中的所有代码
Ctrl+×(小键盘) 展开当前类中的所有代码
-----------Ctrl+Shift 系列-----------
Ctrl+Shift+F 格式化当前代码
Ctrl+Shift+X 把当前选中的文本全部变味小写
Ctrl+Shift+Y 把当前选中的文本全部变为小写
Ctrl+Shift+O:快速地导入import
Ctrl+Shift+R:打开资源 open Resource
-----------F快捷键 系列-----------
F3:打开声明该引用的文件
F4:打开类型层次结构
F5:单步跳入
F6:单步跳过
F7:单步跳出
F8:继续,如果后面没有断点,程序将运行完
-----------行编辑用-----------
Ctrl+D: 删除当前行
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交互位置(同上)
Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)
Ctrl+Shift+Enter 在当前行插入空行(原理同上条)
-----------不常用的-----------
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)
Ctrl+Shift+S:保存全部
Ctrl+W 关闭当前Editer
Ctrl+Shift+F4 关闭所有打开的Editer
Ctrl+Shift+G: 在workspace中搜索引用
Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)
-----------不明白-----------
Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)
Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)

 

出处:http://jingyan.baidu.com/article/2a1383285ed0d5074a134ff0.html

================================================================================

最常用的 Eclipse 快捷键总结

本文是一些最实用、最齐全、最省时间的 Eclipse 快捷键总结,这些快捷键可以让帮助你完成工作中的任何一个操作。欢迎参考。

1. ctrl+shift+r:打开资源

这可能是所有快捷键组合中最省时间的了。这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xml。美中不足的是这组快捷键并非在所有视图下都能用。

2. ctrl+o:快速outline

如果想要查看当前类的方法或某个特定方法,但又不想把代码拉上拉下,也不想使用查找功能的话,就用ctrl+o吧。它可以列出当前类中的所有方法及属性,你只需输入你想要查询的方法名,点击enter就能够直接跳转至你想去的位置。

3. ctrl+e:快速转换编辑器

这组快捷键将帮助你在打开的编辑器之间浏览。使用ctrl+page down或ctrl+page up可以浏览前后的选项卡,但是在很多文件打开的状态下,ctrl+e会更加有效率。

4. ctrl+2,L:为本地变量赋值

开发过程中,我常常先编写方法,如Calendar.getInstance(),然后通过ctrl+2快捷键将方法的计算结果赋值于一个本地变量 之上。 这样我节省了输入类名,变量名以及导入声明的时间。Ctrl+F的效果类似,不过效果是把方法的计算结果赋值于类中的域。

5. alt+shift+r:重命名

重命名属性及方法在几年前还是个很麻烦的事,需要大量使用搜索及替换,以至于代码变得零零散散的。今天的Java IDE提供源码处理功能,Eclipse也是一样。现在,变量和方法的重命名变得十分简单,你会习惯于在每次出现更好替代名称的时候都做一次重命名。要使 用这个功能,将鼠标移动至属性名或方法名上,按下alt+shift+r,输入新名称并点击回车。就此完成。如果你重命名的是类中的一个属性,你可以点击alt+shift+r两次,这会呼叫出源码处理对话框,可以实现get及set方法的自动重命名。

6. alt+shift+l以及alt+shift+m:提取本地变量及方法

源码处理还包括从大块的代码中提取变量和方法的功能。比如,要从一个string创建一个常量,那么就选定文本并按下alt+shift+l即可。 如果同 一个string在同一类中的别处出现,它会被自动替换。方法提取也是个非常方便的功能。将大方法分解成较小的、充分定义的方法会极大的减少复杂度,并提 升代码的可测试性。

7. shift+enter及ctrl+shift+enter

Shift+enter在当前行之下创建一个空白行,与光标是否在行末无关。Ctrl+shift+enter则在当前行之前插入空白行。

8. Alt+方向键

这也是个节省时间的法宝。这个组合将当前行的内容往上或下移动。在try/catch部分,这个快捷方式尤其好使。

9. ctrl+m

大显示屏幕能够提高工作效率是大家都知道的。Ctrl+m是编辑器窗口最大化的快捷键。

10. ctrl+.及ctrl+1:下一个错误及快速修改

ctrl+.将光标移动至当前文件中的下一个报错处或警告处。这组快捷键我一般与ctrl+1一并使用,即修改建议的快捷键。新版Eclipse的 修改建 议做的很不错,可以帮你解决很多问题,如方法中的缺失参数,throw/catch exception,未执行的方法等等。

更多快捷键组合可在Eclipse按下ctrl+shift+L查看。

让我们按照使用频率来看看我最爱用的一些热键组合。(注:以下内容在Eclipse3.02及一上版本通过测试)

1. Control-Shift-T: 打开类型(Open type)。如果你不是有意磨洋工,还是忘记通过源码树(source tree)打开的方式吧。用eclipse很容易打开接口的实现类的,按ctrl+t会列出接口的实现类列表

2. Control-Shift-R: 打开资源(不只是用来寻找Java文件)。小提示:利用Navigator视图的黄色双向箭头按钮让你的编辑窗口和导航器相关联。这会让你打开的文件对应显示在导航器的层级结构中,这样便于组织信息。如果这影响了速度,就关掉它。

3. F3: 打开申明(Open declaration)。或者,利用Declaration Tab(在Java视图模式下,选择Windows –> Show View — > Declaration)。当你选中代码中的一个方法,然后按这个按键,它会把整个方法在申明方框里显示出来。

4. Alt-left arrow: 在导航历史记录(Navigation History)中后退。就像Web浏览器的后退按钮一样,在利用F3跳转之后,特别有用。(用来返回原先编译的地方)

5. Alt-right arrow: 导航历史记录中向前。

6. Control-Q: 回到最后一次编辑的地方。这个快捷键也是当你在代码中跳转后用的。特别是当你钻的过深,忘记你最初在做什么的时候。

7. Control-Shift-G: 在workspace中搜索引用(reference)。这 是重构的前提。对于方法,这个热键的作用和F3恰好相反。它使你在方法的栈中,向上找出一个方法的所有调用者。一个与此相关的功能是开启“标记”功能 (occurrence marking) 。选择Windows->Preferences->Java-> Editor-> Mark Occurrences,勾选选项。这时,当你单击一个元素的时候,代码中所有该元素存在的地方都会被高亮显示。我个人只使用“标记本地变量”(Mark Local Variables)。注意:太多的高亮显示会拖慢Eclipse。

8. Control-Shift-F: CodeàJavaàPreferencesà根据代码风格设定重新格式化代码。我 们的团队有统一的代码格式,我们把它放在我们的wiki上。要这么做,我们打开Eclipse,选择Window Style,然后设置Code Formatter,Code Style和Organize Imports。利用导出(Export)功能来生成配置文件。我们把这些配置文件放在wiki上,然后团队里的每个人都导入到自己的Eclipse中。

9. Control-O: 快速概要(quick outline)。通过这个快捷键,你可以迅速的跳到一个方法或者属性,只需要输入名字的头几个字母。

10. Control-/: 对一行注释或取消注释。对于多行也同样适用。

11. Control-Alt-down arrow: 复制高亮显示的一行或多行。

12. Alt-down arrow: 将一行或多行向下移动。Alt-up arrow会向上移动。

其他的热键在菜单里有。你可以通过按下Control-Shift-L(从3.1版本开始), 看到所有快捷键的列表。按下Control-Shift-L两次,会显示热键对话框(Keys Preferences dialog),你可以在这里自己设置热键。我欢迎你在Talkback部分发表你的Eclipse提示。

其他的Eclipse窍门

我总结了几个相关的小窍门:

锁定命令行窗口:在命令行视图中(Window ->Show View ->Other ->Basic ->Console),试试看用滚动锁定按钮来锁定控制台输出不要滚屏。

使用Ant视图: 在我的Java或Debug模式下,我喜欢显示出Ant视图,这样我就可以迅速的运行Ant任务。通过Window Ant可以找到该视图。把Ant视图放在屏幕的一角, 通过“添加编译文件(Addà Other à Show View à Buildfiles)”按钮来添加build.xml文件。在3.1版本中,甚至支持Ant调试脚本语言。

自动遍历一个集合:for + Control-Space: 如果你还不知道,那么你应该记住Control-Space是自动完成功能。在Eclipse中,你还可以自动完成结构。在一个数组或集合范围内,试试看 输入“for”然后按下Control-Space键。Eclipse会问你你想要遍历哪一个集合然后自动完成循环代码。

使用分级布局: 在包浏览视图(Package Explorer view)中默认的布局(扁平式)方式让我困惑,它把包的全名显示在导航树(navigation tree)中。我更喜欢我源码的包和文件系统视图,在Eclipse中叫做分级布局(Hierarchical Layout)。要切换到这种模式,点击包浏览视图中向下的按钮,选择布局(Layout),然后选择分级(Hierarchial)。

一次显示多个文件:你可以一次浏览多个文件。把不在激活状态的编辑窗口拖到激活窗口的底部或侧边的滚动条上,就可以打开该编辑窗口。这是我能描述该窍门的最好方式了。

同时打开两个Eclipse: 要将改动从一个CVS分支上合并到另外一个上,我喜欢通过同时打开两个工作目录(Workspace)不同Eclipse来实现。这样我可以通过比较 CVS上的最新版本看到所有的变化(右键单击工程,然后选择Compare Lastest from HEAD)然后把每一个变化都合并到另外一个CVS分支上。启动多个Eclipse的最简单的方法是利用Eclipseàwith Launcher。

Implementors插件:安装一个能够跳到一个接口的实现的插件。如果你是个dependency injection 粉丝,或者正在基于编写优良的接口工作,那么你需要一个这样的插件来加速代码导航。 你可以在SourceForge找到这个插件。

Ctrl+Alt+H

如果你想知道一个类的方法到底被那些其他的类调用,那么请选中这个方法名,然后按“Ctrl+Alt+H”,

Eclipse就会显示出这个方法被哪些方法调用,最终产生一个调用关系树。

1. Ctrl+左键

这个是大多数人经常用到的,用来查看变量、方法、类的定义

2. Ctrl+O

查看一个类的纲要,列出其方法和成员变量。提示:再多按一次Ctrl+O,可以列出该类继承的方法和变量。

助记:”O”—>”Outline”—>”纲要”

3. Ctrl+T

查看一个类的继承关系树,是自顶向下的,再多按一次Ctrl+T, 会换成自底向上的显示结构。

提示:选中一个方法名,按Ctrl+T,可以查看到有这个同名方法的父类、子类、接口。

助记:”T”——->”Tree”—–>”层次树”

4.Alt+左右方向键

我们经常会遇到看代码时Ctrl+左键,层层跟踪,然后迷失在代码中的情况,这时只需要按“Alt+左方向键”就可以退回到上次阅读的位置,同理,按“Alt+右方向键”会前进到刚才退回的阅读位置,就像浏览器的前进和后退按钮一样。

导入包:Ctrl+Shift+O

编辑

作用域 功能 快捷键

全局 查找并替换 Ctrl+F

文本编辑器 查找上一个 Ctrl+Shift+K

文本编辑器 查找下一个 Ctrl+K

全局 撤销 Ctrl+Z

全局 复制 Ctrl+C

全局 恢复上一个选择 Alt+Shift+↓

全局 剪切 Ctrl+X

全局 快速修正 Ctrl1+1

全局 内容辅助 Alt+/

全局 全部选中 Ctrl+A

全局 删除 Delete

全局 上下文信息 Alt+?

Alt+Shift+?

Ctrl+Shift+Space

Java编辑器 显示工具提示描述 F2

Java编辑器 选择封装元素 Alt+Shift+↑

Java编辑器 选择上一个元素 Alt+Shift+←

Java编辑器 选择下一个元素 Alt+Shift+→

文本编辑器 增量查找 Ctrl+J

文本编辑器 增量逆向查找 Ctrl+Shift+J

全局 粘贴 Ctrl+V

全局 重做 Ctrl+Y

查看

作用域 功能 快捷键

全局 放大 Ctrl+=

全局 缩小 Ctrl+-

窗口

作用域 功能 快捷键

全局 激活编辑器 F12

全局 切换编辑器 Ctrl+Shift+W

全局 上一个编辑器 Ctrl+Shift+F6

全局 上一个视图 Ctrl+Shift+F7

全局 上一个透视图 Ctrl+Shift+F8

全局 下一个编辑器 Ctrl+F6

全局 下一个视图 Ctrl+F7

全局 下一个透视图 Ctrl+F8

文本编辑器 显示标尺上下文菜单 Ctrl+W

全局 显示视图菜单 Ctrl+F10

全局 显示系统菜单 Alt+-

导航

作用域 功能 快捷键

Java编辑器 打开结构 Ctrl+F3

全局 打开类型 Ctrl+Shift+T

全局 打开类型层次结构 F4

全局 打开声明 F3

全局 打开外部javadoc Shift+F2

全局 打开资源 Ctrl+Shift+R

全局 后退历史记录 Alt+←

全局 前进历史记录 Alt+→

全局 上一个 Ctrl+,

全局 下一个 Ctrl+.

Java编辑器 显示大纲 Ctrl+O

全局 在层次结构中打开类型 Ctrl+Shift+H

全局 转至匹配的括号 Ctrl+Shift+P

全局 转至上一个编辑位置 Ctrl+Q

Java编辑器 转至上一个成员 Ctrl+Shift+↑

Java编辑器 转至下一个成员 Ctrl+Shift+↓

文本编辑器 转至行 Ctrl+L

搜索

作用域 功能 快捷键

全局 出现在文件中 Ctrl+Shift+U

全局 打开搜索对话框 Ctrl+H

全局 工作区中的声明 Ctrl+G

全局 工作区中的引用 Ctrl+Shift+G

文本编辑

作用域 功能 快捷键

文本编辑器 改写切换 Insert

文本编辑器 上滚行 Ctrl+↑

文本编辑器 下滚行 Ctrl+↓

文件

作用域 功能 快捷键

全局 保存 Ctrl+X Ctrl+S

全局 打印 Ctrl+P

全局 关闭 Ctrl+F4

全局 全部保存 Ctrl+Shift+S

全局 全部关闭 Ctrl+Shift+F4

全局 属性 Alt+Enter

全局 新建 Ctrl+N

项目

作用域 功能 快捷键

全局 全部构建 Ctrl+B

源代码

作用域 功能 快捷键

Java编辑器 格式化 Ctrl+Shift+F

Java编辑器 取消注释 Ctrl+/

Java编辑器 注释 Ctrl+/

Java编辑器 添加单个import Ctrl+Shift+M

Java编辑器 组织多个import Ctrl+Shift+O

Java编辑器 使用try/catch块来包围 未设置,太常用了,所以在这里列出,建议自己设置。也可以使用Ctrl+1自动修正。

调试/运行

作用域 功能 快捷键

全局 单步返回 F7

全局 单步跳过 F6

全局 单步跳入 F5

全局 单步跳入选择 Ctrl+F5

全局 调试上次启动 F11

全局 继续 F8

全局 使用过滤器单步执行 Shift+F5

全局 添加/去除断点 Ctrl+Shift+B

全局 显示 Ctrl+D

全局 运行上次启动 Ctrl+F11

全局 运行至行 Ctrl+R

全局 执行 Ctrl+U

重构

作用域 功能 快捷键

全局 撤销重构 Alt+Shift+Z

全局 抽取方法 Alt+Shift+M

全局 抽取局部变量 Alt+Shift+L

全局 内联 Alt+Shift+I

全局 移动 Alt+Shift+V

全局 重命名 Alt+Shift+R

全局 重做 Alt+Shift+Y

(1)Ctrl+M切换窗口的大小

(2)Ctrl+Q跳到最后一次的编辑处

(3)F2当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show Tooltip Description。

F3跳到声明或定义的地方。

F5单步调试进入函数内部。

F6单步调试不进入函数内部,如果装了金山词霸2006则要把“取词开关”的快捷键改成其他的。

F7由函数内部返回到调用处。

F8一直执行到下一个断点。

(4)Ctrl+Pg~对于XML文件是切换代码和图示窗口

(5)Ctrl+Alt+I看Java文件中变量的相关信息

(6)Ctrl+PgUp对于代码窗口是打开“Show List”下拉框,在此下拉框里显示有最近曾打开的文件

(7)Ctrl+/ 在代码窗口中是这种//~注释。Ctrl+Shift+/ 在代码窗口中是这种/*~*/注释,在JSP文件窗口中是〈!–~–〉。

(8)Alt+Shift+O(或点击工具栏中的Toggle Mark Occurrences按钮) 当点击某个标记时可使本页面中其他地方的此标记黄色凸显,并且窗口的右边框会出现白色的方块,点击此方块会跳到此标记处。

(9)右击窗口的左边框即加断点的地方选Show Line Numbers可以加行号。

(10)Ctrl+I格式化激活的元素Format Active Elements。Ctrl+Shift+F格式化文件Format Document。

(11)Ctrl+S保存当前文件。Ctrl+Shift+S保存所有未保存的文件。

(12)Ctrl+Shift+M(先把光标放在需导入包的类名上) 作用是加Import语句。Ctrl+Shift+O作用是缺少的Import语句被加入,多余的Import语句被删除。

(13)Ctrl+Space提示键入内容即Content Assist,此时要将输入法中Chinese(Simplified)IME-Ime/Nonlme Toggle的快捷键(用于切换英文和其他文字)改成其他的。Ctrl+Shift+Space提示信息即Context Information。

(14)双击窗口的左边框可以加断点。

(15)Ctrl+D删除当前行。

Eclipse快捷键大全

Ctrl+1 快速修复(最经典的快捷键,就不用多说了)

Ctrl+D: 删除当前行

Ctrl+Alt+↓ 复制当前行到下一行(复制增加)

Ctrl+Alt+↑ 复制当前行到上一行(复制增加)

Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)

Alt+↑ 当前行和上面一行交互位置(同上)

Alt+← 前一个编辑的页面

Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)

Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性

Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)

Shift+Ctrl+Enter 在当前行插入空行(原理同上条)

Ctrl+Q 定位到最后编辑的地方

Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)

Ctrl+M 最大化当前的Edit或View (再按则反之)

Ctrl+/ 注释当前行,再按则取消注释

Ctrl+O 快速显示 OutLine

Ctrl+T 快速显示当前类的继承结构

Ctrl+W 关闭当前Editer

Ctrl+K 参照选中的Word快速定位到下一个

Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)

Ctrl+/(小键盘) 折叠当前类中的所有代码

Ctrl+×(小键盘) 展开当前类中的所有代码

Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)

Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)

Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)

Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)

Ctrl+Shift+F4 关闭所有打开的Editer

Ctrl+Shift+X 把当前选中的文本全部变味小写

Ctrl+Shift+Y 把当前选中的文本全部变为小写

Ctrl+Shift+F 格式化当前代码

Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)

下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开头的了)

Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)

Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)

Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)

Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)

Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能)

Alt+Shift+I 合并变量(可能这样说有点不妥Inline)

Alt+Shift+V 移动函数和变量(不怎么常用)

Alt+Shift+Z 重构的后悔药(Undo)